Если вы возвращаете экземпляр ответа PSR-7 из маршрута или контроллера,
это автоматически будут конвертированно назад в экземпляр ответа Laravel
и будет показан фреймворком.
Запросы
Содержание:
- Доступ к запросу
- Нормализация и обрезка входных данных
- Получение входных данных
- Файлы
- Настройка доверенных Proxies
Доступ к запросу
Для того чтобы получить экземпляр текущего запроса HTTP с помощью инъекции зависимостей, вам необходимо ввести Illuminate\Http\Request class для вашего метода контроллера. Экземпляр входящего запроса будет автоматически введен через сервис контейнер:
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 через определение метода контроллера следующим образом:
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)
{
//
}
}
Доступ к запросу через замыкание
Вы можете вписать класс Illuminate\Http\Request в замыкание маршрута. Сервис контейнер автоматически внедрит входящий запрос при выполнении:
use Illuminate\Http\Request;
Route::get('/', function (Request $request) {
//
});
Пути и методы запросов
Экземпляр класса Illuminate\Http\Request включает в себя большое количество методов для проверки HTTP запроса вашего приложения и расширяет класс 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 путём вписывания запроса в интерфейс замыкания маршрута или метод контроллера:
use Psr\Http\Message\ServerRequestInterface;
Route::get('/', function (ServerRequestInterface $request) {
//
});
Нормализация и обрезка входных данных
По умолчанию, Laravel включает посредники TrimStrings и ConvertEmptyStringsToNull в глобальный список посредников вашего приложения. Все пункты перечислены в классе App\Http\Kernel. Эти посредники автоматически обрабатывают входящие данные запроса и конвертируют пустые строки в null. Это позволяет не волноваться этого вопроса в контроллере или маршруте.
Если вы хотите отменить такое поведение, вы можете убрать посредника из списка посредников $middleware в классе App\Http\Kernel.
Получение входных данных
Получение всех входных данных
Вы можете получить все данные как массив используя метод all:
$input = $request->all();
Получение значений входных данных
Используя несколько простых методов, вы можете получить все данные пользователя из зкземпляра Illuminate\Http\Request без беспокойства о том, какая HTTP команда была использована для запроса. Вне зависимости от команды HTTP, метод 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 в первую очередь обращается к значению параметра запроса. Если такого нет, тогда Ларавел обращается к параметрам маршрута.
Получение JSON данных ввода
При отправке JSON запросов в ваше приложение, Вы можете получить JSON данные через метод input, пока загаловок запроса 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');
Есть ли значение в данных?
Вы должны использовать метод has чтобы определить что такое значение присутсвует в запросе. Метод has вернёт true, если значение присутствует в запросе:
if ($request->has('name')) {
//
}
Когда дан массив, метод has определит, если все указанные значения существуют:
if ($request->has(['name', 'email'])) {
//
}
Если вы хотите определить, что значение присутствует в запросе и не пустое, вы можете использовть метод filled:
if ($request->filled('name')) {
//
}
Старые вводные данные
Ларавел позволяет вам держать старые вводные данные запроса до следующего запроса. Эта возможность может быть полезна для восстановления данных формы после ошибок валидации. Но если вы используете включённые в Ларавел возможности валидации, вам не придется делать эту работу вручную с силу того, что встроееные возможности сделают это автоматически.
Передача данных ввода в сессию
Метод 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. Этот метод вернёт данные старого ввода из сессии.
$username = $request->old('username');
Ларавел также предоставляет доступ к глобальной функции помощнику old. Если вы показываете старые данные внутри шаблонизатора Blade, более удобно испоьзовать помощник с одноимённым названием old. Если нет старых данных для выбранного поля, то вернётся null:
<input type="text" name="username" value='{{ old("username") }}'>
Cookies
Получение Cookies из запросов
Все cookies созданные фреймворком Laravel шифруются и подписываются с помощью аутентификационного кода. Это значит, что они будут признаны неверными, если будут подвергнуты изменению со стороны клиента. Чтобы получить значение cookie из запроса, используйте метод cookie на экземпляр Illuminate\Http\Request:
$value = $request->cookie('name');
Как альтернатива, вы можете использовать фасад Cookie, чтобы получить доступ к значениям cookie:
use Illuminate\Support\Facades\Cookie;
$value = Cookie::get('name');
Прикрепление Cookies к ответам
Вы можете прикрепить cookie для исходящего экземпляра Illuminate\Http\Response используя метод cookie. Вам необходимо передать имя, значение и количество минут, в течение которых файл cookie должен считаться действительным для данного метода:
return response('Hello World')->cookie(
'name', 'value', $minutes
);
Метод cookie также принимает и другие аргументы, которые используются не так часто. В целом, эти аргументы имеют теже задачи, что и обычный метод PHP setcookie:
return response('Hello World')->cookie(
'name', 'value', $minutes, $path, $domain, $secure, $httpOnly
);
Дополнительно вы можете использовать фасад Cookie, чтобы поставить в очередь cookies для вложений для исходящего ответа вашего приложения. Метод queue принимает экземпляр Cookie или аргументы, необходимые для создания экземепляра Cookie. Эти cookies будут прикреплены в исходящий ответ до момента отправки в браузер:
Cookie::queue(Cookie::make('name', 'value', $minutes));
Cookie::queue('name', 'value', $minutes);
Генерирование экземпляра Cookie
Если вы хотите сгенерировать экземпляр Symfony\Component\HttpFoundation\Cookie, который можно передать в ответ через некоторое время, вы можете использовать глобальную функцию-помощник cookie. Эти cookie не будут высылаться клиенту, если только они не прикреплены к экземпляру ответа:
$cookie = cookie('name', 'value', $minutes);
return response('Hello World')->cookie($cookie);
Файлы
Получение загруженных файлов
Вы можете получить доступ к загруженным файлам экземпляра Illuminate\Http\Request используя метод file или используя динамические свойства. Метод file возвращает экземпляр класса Illuminate\Http\UploadedFile, который расширяет класс PHP 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 принимает путь, где файл должен храниться относительно корневой директории файловой системы. Этот путь должен не содержать имя файла, так как уникальный ID будет автоматически сгенерирован, чтобы служить в качестве имени файла.
Метод 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');
Настройка доверенных Proxies
При работе приложения с балансировщиком нагрузки, который обслуживает сертификаты TLS / SSL, вы можете заметить, что приложение иногда не генерирует ссылки HTTPS. Обычно это происходит из-за того, что приложение перенаправляет трафик от балансировщика нагрузки на порт 80 и не знает, что должны получиться безопасные ссылки.
Чтобы решить этот вопрос, вы можете использовать включённого в Ларавел посредника App\Http\Middleware\TrustProxies, который позволит вам быстро настроить балансировщиоков или прокси, которые должны быть доверенными для вашего приложения. Доверенные прокси должны быть перечислены как массив в переменной $proxies в свойсве посредника. В дополнение, чтобы настроить доверенные прокси, вы можете настроить прокси $headers, которые должны быть доверенными:
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;
}
Все прокси доверенные
Если вы используете Amazon AWS или другой облачный балансировщик нагрузки в качестве провайдера, вы можете не знать IP адреса для вашего актуального балансировщика. В этом случае, вы можете использовать *, чтобы делать все прокси доверенными:
/**
* The trusted proxies for this application.
*
* @var array
*/
protected $proxies = '*';