Доступ к запросу
Чтобы получить экземпляр текущего HTTP-запроса через внедрение зависимостей, вы должны указать класс в методе контроллера. Экземпляр входящего запроса будет автоматически добавлен сервисным контейнером :Illuminate\Http\Request
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
/**
* Store a new user.
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
$name = $request->input('name');
//
}
}
Внедрение зависимостей и параметры маршрута
Если ваш метод контроллера также ожидает ввода от параметра маршрута, вы должны перечислить параметры вашего маршрута после других ваших зависимостей. Например, если ваш маршрут определен так:
Route::put('user/{id}', 'UserController@update');
Вы все еще можете напечатать подсказку и получить доступ к параметру маршрута , определив метод контроллера следующим образом:Illuminate\Http\Request
id
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
/**
* Update the specified user.
*
* @param Request $request
* @param string $id
* @return Response
*/
public function update(Request $request, $id)
{
//
}
}
Доступ к запросу через закрытие маршрута
Вы также можете напечатать класс на маршруте Закрытие. Служебный контейнер автоматически внедрит входящий запрос в Closure, когда он будет выполнен:Illuminate\Http\Request
use Illuminate\Http\Request;
Route::get('/', function (Request $request) {
//
});
Путь и метод запроса
Экземпляр предоставляет различные методы для изучения запроса HTTP для вашего приложения и расширяет класс. Мы обсудим некоторые из наиболее важных методов ниже.Illuminate\Http\Request
Symfony\Component\HttpFoundation\Request
Получение пути запроса
path
Метод возвращает информацию о пути в запросе. Итак, если на входящий запрос нацелен , метод вернет :http://domain.com/foo/bar
path
foo/bar
$uri = $request->path();
is
Метод позволяет проверить , что входящий путь запроса соответствует заданному шаблону. Вы можете использовать *
символ в качестве подстановочного знака при использовании этого метода:
if ($request->is('admin/*')) {
//
}
Получение запроса URL
Чтобы получить полный URL-адрес для входящего запроса, вы можете использовать методы url
или fullUrl
. url
Метод возвращает URL без строки запроса, в то время как fullUrl
метод включает в себя строку запроса:
// Without Query String...
$url = $request->url();
// With Query String...
$url = $request->fullUrl();
Получение метода запроса
method
Метод возвращает глагол HTTP для запроса. Вы можете использовать isMethod
метод, чтобы убедиться, что глагол HTTP соответствует заданной строке:
$method = $request->method();
if ($request->isMethod('post')) {
//
}
PSR-7 Запросы
Стандарт PSR-7 определяет интерфейсы для сообщений HTTP, включая запросы и ответы. Если вы хотите получить экземпляр запроса PSR-7 вместо запроса Laravel, вам сначала необходимо установить несколько библиотек. Laravel использует компонент Symfony HTTP Message Bridge для преобразования типичных запросов и ответов Laravel в реализации, совместимые с PSR-7:
composer require symfony/psr-http-message-bridge
composer require zendframework/zend-diactoros
После того, как вы установили эти библиотеки, вы можете получить запрос PSR-7, указав интерфейс запроса на вашем методе Closure или контроллере маршрута:
use Psr\Http\Message\ServerRequestInterface;
Route::get('/', function (ServerRequestInterface $request) {
//
});
Если вы возвращаете экземпляр ответа PSR-7 из маршрута или контроллера, он автоматически преобразуется обратно в экземпляр ответа Laravel и отображается платформой.
Подстройка входного сигнала и нормализация
По умолчанию Laravel включает TrimStrings
и ConvertEmptyStringsToNull
промежуточное ПО в глобальный стек промежуточного ПО вашего приложения. Эти промежуточные программы перечислены в стеке классом. Это промежуточное ПО автоматически обрезает все входящие строковые поля по запросу, а также преобразует любые пустые строковые поля в . Это позволяет вам не беспокоиться об этих проблемах нормализации в ваших маршрутах и контроллерах.App\Http\Kernel
null
Если вы хотите отключить это поведение, вы можете удалить два промежуточных программного обеспечения из стека промежуточного программного обеспечения вашего приложения, удалив их из $middleware
свойства вашего класса.App\Http\Kernel
Получение ввода
Получение всех входных данных
Вы также можете получить все входные данные, array
используя all
метод:
$input = $request->all();
Получение входного значения
Используя несколько простых методов, вы можете получить доступ ко всем пользовательским данным из вашего экземпляра, не беспокоясь о том, какой HTTP-глагол был использован для запроса. Независимо от HTTP-глагола, метод может быть использован для извлечения пользовательского ввода:Illuminate\Http\Request
input
$name = $request->input('name');
Вы можете передать значение по умолчанию в качестве второго аргумента input
метода. Это значение будет возвращено, если запрошенное входное значение отсутствует в запросе:
$name = $request->input('name', 'Sally');
При работе с формами, содержащими входные данные массива, используйте обозначение «точка» для доступа к массивам:
$name = $request->input('products.0.name');
$names = $request->input('products.*.name');
Вы можете вызвать input
метод без каких-либо аргументов, чтобы извлечь все входные значения в виде ассоциативного массива:
$input = $request->input();
Получение входных данных из строки запроса
В то время как input
метод извлекает значения из всей полезной нагрузки запроса (включая строку запроса), query
метод извлекает значения только из строки запроса:
$name = $request->query('name');
Если запрошенные данные значения строки запроса отсутствуют, будет возвращен второй аргумент этого метода:
$name = $request->query('name', 'Helen');
Вы можете вызвать query
метод без каких-либо аргументов, чтобы получить все значения строки запроса в виде ассоциативного массива:
$query = $request->query();
Получение входных данных через динамические свойства
Вы также можете получить доступ к пользовательскому вводу, используя динамические свойства экземпляра. Например, если одна из форм вашего приложения содержит поле, вы можете получить доступ к значению поля следующим образом:Illuminate\Http\Request
name
$name = $request->name;
При использовании динамических свойств Laravel сначала будет искать значение параметра в полезной нагрузке запроса. Если его нет, Laravel будет искать поле в параметрах маршрута.
Получение входных значений JSON
При отправке запросов JSON в ваше приложение вы можете получить доступ к данным JSON с помощью input
метода, если заголовок запроса правильно установлен на . Вы даже можете использовать синтаксис "точка", чтобы копаться в массивах JSON:Content-Type
application/json
$name = $request->input('user.name');
Получение части входных данных
Если вам нужно получить подмножество входных данных, вы можете использовать only
и except
методу. Оба эти метода принимают один array
или динамический список аргументов:
$input = $request->only(['username', 'password']);
$input = $request->only('username', 'password');
$input = $request->except(['credit_card']);
$input = $request->except('credit_card');
only
Метод возвращает все пары ключ / значение , которые вы запрашиваете; однако он не будет возвращать пары ключ / значение, которые отсутствуют в запросе.
Определение наличия входного значения
Вы должны использовать has
метод, чтобы определить, присутствует ли значение в запросе. has
Метод возвращает , true
если значение присутствует на запросе:
if ($request->has('name')) {
//
}
Когда задан массив, has
метод определит, присутствуют ли все указанные значения:
if ($request->has(['name', 'email'])) {
//
}
Если вы хотите определить, присутствует ли значение в запросе и не является ли оно пустым, вы можете использовать filled
метод:
if ($request->filled('name')) {
//
}
Старый вход
Laravel позволяет вам сохранить ввод от одного запроса во время следующего запроса. Эта функция особенно полезна для повторного заполнения форм после обнаружения ошибок проверки. Однако, если вы используете встроенные функции проверки Laravel , вряд ли вам придется использовать эти методы вручную, поскольку некоторые из встроенных средств проверки Laravel будут вызывать их автоматически.
Мигает вход в сессию
flash
Метод на классе будет мигать текущий вход на сессию , так что он доступен во время следующего запроса пользователя к приложению:Illuminate\Http\Request
$request->flash();
Вы можете также использовать flashOnly
и flashExcept
методу прошить подмножество данных запроса на сессию. Эти методы полезны для хранения конфиденциальной информации, такой как пароли, вне сеанса:
$request->flashOnly(['username', 'email']);
$request->flashExcept('password');
Мигающий ввод, затем перенаправление
Поскольку вам часто захочется перенести ввод в сеанс, а затем перенаправить на предыдущую страницу, вы можете легко соединить мигающий ввод с перенаправлением, используя withInput
метод:
return redirect('form')->withInput();
return redirect('form')->withInput(
$request->except('password')
);
Получение старого ввода
Для извлечения введенных данных из предыдущего запроса используйте old
метод в Request
экземпляре. old
Метод будет тянуть ранее мелькнула входные данные из сессии :
$username = $request->old('username');
Laravel также предоставляет глобального old
помощника. Если вы отображаете старый ввод в шаблоне Blade , более удобно использовать old
помощника. Если для данного поля не существует старого ввода, null
будет возвращено:
<input type="text" name="username" value="{{ old('username') }}">
Печенье
Получение Cookies из запросов
Все файлы cookie, создаваемые платформой Laravel, шифруются и подписываются кодом аутентификации, что означает, что они будут считаться недействительными, если они были изменены клиентом. Чтобы получить значение cookie из запроса, используйте cookie
метод в экземпляре:Illuminate\Http\Request
$value = $request->cookie('name');
Кроме того, вы можете использовать Cookie
фасад для доступа к значениям cookie:
$value = Cookie::get('name');
Прикрепление файлов cookie к ответам
Вы можете прикрепить cookie к исходящему экземпляру, используя метод. Вы должны передать имя, значение и количество минут, в течение которых cookie должен считаться действительным для этого метода:Illuminate\Http\Response
cookie
return response('Hello World')->cookie(
'name', 'value', $minutes
);
cookie
Метод также принимает несколько аргументов , которые используются реже. Как правило, эти аргументы имеют ту же цель и значение, что и аргументы, которые будут переданы нативномуметоду setcookie в PHP :
return response('Hello World')->cookie(
'name', 'value', $minutes, $path, $domain, $secure, $httpOnly
);
Кроме того, вы можете использовать Cookie
фасад, чтобы «поставить в очередь» файлы cookie для прикрепления к исходящему ответу из вашего приложения. queue
Метод принимает Cookie
экземпляр или аргументы , необходимые для создания Cookie
экземпляра. Эти файлы cookie будут прикреплены к исходящему ответу до его отправки в браузер:
Cookie::queue(Cookie::make('name', 'value', $minutes));
Cookie::queue('name', 'value', $minutes);
Генерация файлов cookie
Если вы хотите создать экземпляр, который может быть передан экземпляру ответа позже, вы можете использовать глобальный помощник. Этот файл cookie не будет отправлен обратно клиенту, если он не присоединен к экземпляру ответа:Symfony\Component\HttpFoundation\Cookie
cookie
$cookie = cookie('name', 'value', $minutes);
return response('Hello World')->cookie($cookie);
Файлы
Получение загруженных файлов
Вы можете получить доступ к загруженным файлам из экземпляра, используя метод или используя динамические свойства. Метод возвращает экземпляр класса, который расширяет PHP класс и предоставляет множество методов для взаимодействия с файлом:Illuminate\Http\Request
file
file
Illuminate\Http\UploadedFile
SplFileInfo
$file = $request->file('photo');
$file = $request->photo;
Вы можете определить, присутствует ли файл в запросе, используя hasFile
метод:
if ($request->hasFile('photo')) {
//
}
Проверка успешных загрузок
Помимо проверки наличия файла, вы можете убедиться, что не было проблем с загрузкой файла с помощью isValid
метода:
if ($request->file('photo')->isValid()) {
//
}
Пути к файлам и расширения
UploadedFile
Класс также содержит методы для получения доступа полного пути к файлу и его расширения. extension
Метод будет пытаться угадать расширение файла на основе его содержания. Это расширение может отличаться от расширения, предоставленного клиентом:
$path = $request->photo->path();
$extension = $request->photo->extension();
Другие методы файла
Есть множество других методов, доступных на UploadedFile
экземплярах. Ознакомьтесь с документацией API для класса для получения дополнительной информации об этих методах.
Хранение загруженных файлов
Для хранения загруженного файла вы обычно будете использовать одну из настроенных файловых систем . У UploadedFile
класса есть store
метод, который перемещает загруженный файл на один из ваших дисков, который может быть местом в вашей локальной файловой системе или даже в облачном хранилище, таком как Amazon S3.
store
Метод принимает путь к файлу должен быть сохранен относительно настроенного корневого каталога в файловой системе в. Этот путь не должен содержать имя файла, так как уникальный идентификатор будет автоматически сгенерирован в качестве имени файла.
store
Метод также принимает необязательный второй аргумент для имени диска , который должен использоваться для хранения файла. Метод вернет путь к файлу относительно корня диска:
$path = $request->photo->store('images');
$path = $request->photo->store('images', 's3');
Если вы не хотите, чтобы имя файла создавалось автоматически, вы можете использовать storeAs
метод, который принимает в качестве аргументов путь, имя файла и имя диска:
$path = $request->photo->storeAs('images', 'filename.jpg');
$path = $request->photo->storeAs('images', 'filename.jpg', 's3');
Настройка доверенных прокси
При запуске ваших приложений за балансировщиком нагрузки, который завершает сертификаты TLS / SSL, вы можете заметить, что ваше приложение иногда не генерирует HTTPS-ссылки. Обычно это происходит потому, что ваше приложение перенаправляет трафик с вашего балансировщика нагрузки на порт 80 и не знает, что оно должно генерировать защищенные ссылки.
Чтобы решить эту проблему, вы можете использовать промежуточное программное обеспечение, входящее в ваше приложение Laravel, которое позволяет вам быстро настроить балансировщики нагрузки или прокси-серверы, которым ваше приложение должно доверять. Ваши доверенные прокси должны быть указаны в виде массива в свойстве этого промежуточного программного обеспечения. В дополнение к настройке доверенных прокси вы можете настроить доверенный прокси :App\Http\Middleware\TrustProxies
$proxies
$headers
<?php
namespace App\Http\Middleware;
use Illuminate\Http\Request;
use Fideloper\Proxy\TrustProxies as Middleware;
class TrustProxies extends Middleware
{
/**
* The trusted proxies for this application.
*
* @var array
*/
protected $proxies = [
'192.168.1.1',
'192.168.1.2',
];
/**
* The headers that should be used to detect proxies.
*
* @var string
*/
protected $headers = Request::HEADER_X_FORWARDED_ALL;
}
Если вы используете AWS Elastic Load Balancing, ваше
$headers
значение должно быть таким . Для получения дополнительной информации о константах, которые могут использоваться в свойстве, ознакомьтесь с документацией Symfony о доверяющих прокси .Request::HEADER_X_FORWARDED_AWS_ELB
$headers
Доверие всем прокси
Если вы используете Amazon AWS или другого «облачного» поставщика балансировщика нагрузки, вы можете не знать IP-адреса ваших реальных балансировщиков. В этом случае вы можете использовать *
доверять всем прокси:
/**
* The trusted proxies for this application.
*
* @var array
*/
protected $proxies = '*';
0 комментариев