Получение экземпляра запроса
Для получения экземпляра текущего HTTP-запроса через внедрение зависимости вам надо указать тип класса в методе вашего контроллера. Экземпляр входящего запроса будет автоматически внедрён сервис-контейнером:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
//для версии 5.1 и ранее:
//use Illuminate\Routing\Controller;
class UserController extends Controller
{
/**
* Сохранить нового пользователя.
*
* @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;
//для версии 5.1 и ранее:
//use Illuminate\Routing\Controller;
class UserController extends Controller
{
/**
* Обновить указанного пользователя.
*
* @param Request $request
*
* для версии 5.2 и выше:
* @param string $id
*
* для версии 5.1 и ранее:
* @param int $id
*
* @return Response
*/
public function update(Request $request, $id)
{
//
}
}
добавлено в 5.3 ()
добавлено в 5.0 ()
Через фасад
Фасад Request предоставит вам доступ к текущему запросу, который привязан в контейнере. Например:
$name = Request::input('name');
Помните, если ваш код находится в собственном пространстве имён, то вам надо будет импортировать фасад Request с помощью оператора PHPuse Request;
в начале вашего файла.
Методы и путь запроса
Экземпляр класса Illuminate\Http\Request содержит множество методов для изучения входящего в ваше приложение запроса. Он наследует класс PHPSymfony\Component\HttpFoundation\Request
. Ниже мы обсудим несколько наиболее полезных методов этого класса.
Метод PHPpath()
возвращает информацию о пути запроса. Например, если входящий запрос обращён к http://domain.com/foo/bar, то метод PHPpath()
вернёт foo/bar:
$uri = $request->path();
Метод PHPis()
позволяет проверить соответствие пути запроса заданной маске. При использовании этого метода можно использовать символ * в качестве маски:
if ($request->is('admin/*')) {
//
}
Для получения полного URL без строки запроса используйте метод PHPurl()
:
// без строки запроса...
$url = $request->url();
добавлено в 5.2 ()
Метод PHPmethod()
вернёт HTTP-действие запроса. Вы можете использовать метод PHPisMethod()
для проверки соответствия HTTP-действия заданной строке:
$method = $request->method();
if ($request->isMethod('post')) {
//
}
добавлено в 5.0 ()
Запросы PSR-7
Стандарт PSR-7 описывает интерфейсы для HTTP-сообщений, включая запросы и отклики. Если вы хотите получить экземпляр запроса PSR-7 вместо Laravel-запроса, сначала вам надо установить несколько библиотек. Laravel использует компонент Symfony HTTP Message Bridge для конвертации обычных запросов и откликов Laravel в совместимые с PSR-7:
shcomposer require symfony/psr-http-message-bridge composer require zendframework/zend-diactoros
Когда вы установите эти библиотеки, вы можете получить запрос PSR-7, указав интерфейс запроса в замыкании вашего маршрута или методе контроллера:
use Psr\Http\Message\ServerRequestInterface;
Route::get('/', function (ServerRequestInterface $request) {
//
});
Если вы возвращаете экземпляр отклика PSR-7 из маршрута или контроллера, он будет автоматически конвертирован обратно в экземпляр отклика Laravel и будет отображён фреймворком.
Получение ввода
Вы можете получить все данные ввода в виде массива с помощью метода PHPall()
:
$input = $request->all();
Вы можете получить доступ ко всем введённым данным из экземпляра Illuminate\Http\Request, используя всего несколько простых методов. Вам не нужно думать о том, какой тип HTTP-запроса был использован (GET, POST и т.д.) — метод PHPinput()
работает одинаково для любого из них:
$name = $request->input('name');
Вы можете передать значение по умолчанию вторым аргументом метода PHPinput()
. Это значение будет возвращено, когда запрашиваемый ввод отсутствует в запросе:
$name = $request->input('name', 'Sally');
При работе с формами, имеющими переменные-массивы, вы можете использовать точечную запись для обращения к массивам:
$name = $request->input('products.0.name');
$names = $request->input('products.*.name');
Получение ввода через динамические свойства
Также вы можете получать пользовательский ввод, используя динамический свойства экземпляра Illuminate\Http\Request. Например, если одна из форм приложения содержит поле name, вы можете получить значение отправленного поля вот так:
$name = $request->name;
При использовании динамических свойств Laravel сначала ищет значение параметра в данных запроса. Если его там нет, Laravel будет искать поле в параметрах маршрута.
Получения значения из ввода JSON
При отправке JSON-запросов в приложение вы можете получить доступ к JSON-данным методом PHPinput()
, поскольку заголовок Content-Type запроса установлен в application/json. Вы даже можете использовать «точечный» синтаксис, чтобы погружаться в массивы JSON:
$name = $request->input('user.name');
Определение наличия значения переменной
Для определения наличия значения в запросе используйте метод PHPhas()
. Метод PHPhas()
возвращает true, если значение существует и является непустой строкой:
if ($request->has('name')) {
//
}
Получение части переменных запроса
Если вам необходимо получить только часть данных ввода, используйте методы PHPonly()
и PHPexcept()
. Оба этих метода принимают один массив или динамический список аргументов:
$input = $request->only(['username', 'password']);
$input = $request->only('username', 'password');
$input = $request->except(['credit_card']);
$input = $request->except('credit_card');
добавлено в 5.0 ()
$name = Request::input('name');
Получение переменной или значения по умолчанию, если переменная не была передана
$name = Request::input('name', 'Sally');
if (Request::has('name'))
{
//
}
Получение всех переменных запроса
$input = Request::all();
Получение некоторых переменных
$input = Request::only('username', 'password');
$input = Request::except('credit_card');
При работе с переменными-массивами вы можете использовать точечную запись для доступа к их элементам:
$input = Request::input('products.0.name');
Старый ввод
Вам может пригодиться сохранение пользовательского ввода между двумя запросами. Например, после проверки формы на корректность вы можете заполнить её старыми значениями в случае ошибки. Однако, если вы используете включённые в Laravel возможности проверки ввода, то вряд ли вам понадобиться использовать эти методы вручную, так как встроенные возможности Laravel вызовут их автоматически.
Метод PHPflash()
класса Illuminate\Http\Request передаст текущий ввод в сессию, и он будет доступен во время следующего пользовательского запроса к приложению:
$request->flash();
Для передачи некоторых переменных в сессию используйте методы PHPflashOnly()
и PHPflashExcept()
. Эти методы полезны для хранения важной информации (например, паролей) вне сессии:
//для версии 5.2 и выше:
$request->flashOnly(['username', 'email']);
//для версии 5.1 и ранее:
//$request->flashOnly('username', 'email');
$request->flashExcept('password');
добавлено в 5.0 ()
Request::flashOnly('username', 'email');
Request::flashExcept('password');
Поскольку часто требуется передать ввод в сессии и затем перенаправить на предыдущую страницу, вы можете легко прицепить передачу ввода к перенаправлению с помощью метода PHPwithInput()
:
return redirect('form')->withInput();
return redirect('form')->withInput(
$request->except('password')
);
добавлено в 5.0 ()
return redirect('form')->withInput();
return redirect('form')->withInput(Request::except('password'));
Для получения переданного ввода из предыдущего запроса используйте метод PHPold()
на экземпляре Request. Метод PHPold()
получит переданные ранее данные ввода из сессии:
$username = $request->old('username');
В Laravel есть глобальная вспомогательная функция PHPold()
. Когда вы выводите старый ввод в шаблоне Blade, удобнее использовать эту функцию PHPold
. Если для данного поля нет старого ввода, вернётся PHPnull
:
//для версии 5.2 и выше:
<input type="text" name="username" value="{{ old('username') }}">
//для версии 5.1 и ранее:
//{{ old('username') }}
Cookies
Все cookie, создаваемые Laravel, шифруются и подписываются специальным кодом — таким образом, если клиент изменит их значение, то они станут недействительными. Для получения значения cookie из запроса используйте метод PHPcookie()
на экземпляре Illuminate\Http\Request:
$value = $request->cookie('name');
добавлено в 5.3 ()
Вы можете прикрепить cookie к исходящему экземпляру Illuminate\Http\Response с помощью метода PHPcookie()
. Вы должны передать в этот метод имя, значение и количество минут, в течение которого cookie должен считаться действующим:
return response('Hello World')->cookie(
'name', 'value', $minutes
);
Метод PHPcookie()
также принимает ещё несколько аргументов, используемых менее часто. В целом эти аргументы имеют то же назначение и значение, что и передаваемые в PHP-метод setcookie аргументы:
return response('Hello World')->cookie(
'name', 'value', $minutes, $path, $domain, $secure, $httpOnly
);
Если вы хотите сгенерировать экземпляр Symfony\Component\HttpFoundation\Cookie, который позднее можно будет передать экземпляру отклика, используйте глобальную вспомогательную функцию PHPcookie()
. Этот cookie не будет отправлен обратно клиенту до тех пор, пока не будет прикреплён к экземпляру отклика:
$cookie = cookie('name', 'value', $minutes);
return response('Hello World')->cookie($cookie);
добавлено в 5.2 () 5.1 () 5.0 ()
Добавление cookie к ответу
Глобальная вспомогательная функция PHPcookie()
служит простой фабрикой для генерирования экземпляров Symfony\Component\HttpFoundation\Cookie. Сookie можно прикреплять к экземпляру Illuminate\Http\Response с помощью метода PHPwithCookie()
:
$response = new Illuminate\Http\Response('Hello World');
//для версии 5.2 и выше:
$response->withCookie('name', 'value', $minutes);
//для версии 5.1 и ранее:
//$response->withCookie(cookie('name', 'value', $minutes));
return $response;
Для создания долгоживущих cookie, которые будут существовать в течение 5 лет, используйте метод PHPforever()
на фабрике cookie, сначала вызвав метод PHPcookie()
без аргументов, а затем «прицепить» метод PHPforever()
к возвращённой фабрике cookie:
$response->withCookie(cookie()->forever('name', 'value'));
добавлено в 5.0 ()
Вы также можете поставить cookie в очередь для добавления к исходящему ответу, даже до того как этот ответ был создан:
<?php namespace App\Http\Controllers;
use Cookie;
use Illuminate\Routing\Controller;
class UserController extends Controller
{
/**
* Обновить ресурс
*
* @return Response
*/
public function update()
{
Cookie::queue('name', 'value');
return response('Hello World');
}
}
Файлы
Получение загруженных файлов
Получить доступ к загруженным файлам из экземпляра Illuminate\Http\Request можно с помощью метода PHPfile()
или динамических свойств. Метод PHPfile()
возвращает экземпляр класса Symfony\Component\HttpFoundation\File\UploadedFile, который наследует PHP-класс SplFileInfo и предоставляет различные методы для взаимодействия с файлами:
$file = $request->file('photo');
$file = $request->photo;
Также вы можете определить, есть ли в запросе файл, с помощью метода PHPhasFile()
:
if ($request->hasFile('photo')) {
//
}
Прошёл ли загруженный файл проверку?
Вдобавок к проверке наличия файла вы можете проверить, что при загрузке файла не возникло никаких проблем, с помощью метода PHPisValid()
:
if ($request->file('photo')->isValid()) {
//
}
добавлено в 5.3 ()
Путь и расширение файла
В классе UploadedFile также есть методы для получения полного пути файла и его расширения. Метод PHPextension()
пытается определить расширение файла на основе его содержимого. Это расширение может отличаться от указанного клиентом:
$path = $request->photo->path();
$extension = $request->photo->extension();
добавлено в 5.2 () 5.1 () 5.0 ()
Перемещение загруженного файла
Для перемещения загруженного файла в новое место используйте метод PHPmove()
. Этот метод переместит файл из его временного места хранения (определённого в ваших настройках PHP) на место постоянного хранения по вашему выбору:
$request->file('photo')->move($destinationPath);
$request->file('photo')->move($destinationPath, $fileName);
добавлено в 5.0 ()
Request::file('photo')->move($destinationPath);
Request::file('photo')->move($destinationPath, $fileName);
Другие методы для работы с файлами
Есть множество других методов для экземпляров UploadedFile. Загляните в документацию по API класса за более подробной информацией об этих методах.
добавлено в 5.3 ()
Хранение загруженных файлов
Для хранения загруженного файла обычно используется одна из настроенных файловых систем. В классе UploadedFile есть метод PHPstore()
, который переместит загруженный файл на один из ваших дисков, который может располагаться в вашей локальной файловой системе или даже в облачном хранилище, таком как Amazon S3.
Метод PHPstore()
принимает путь, куда необходимо сохранить файл относительно настроенного корневого каталога файловой системы. Этот путь не должен включать имя файла, поскольку будет автоматически сгенерирован UUID в качестве имени файла.
Также метод PHPstore()
принимает второй необязательный аргумент — имя диска для сохранения файла. Этот метод вернёт путь файла относительно корня диска:
$path = $request->photo->store('images');
$path = $request->photo->store('images', 's3');
Если вы не хотите автоматически генерировать имя файла, используйте метод PHPstoreAs()
, который принимает аргументы: путь, имя файла и имя диска:
$path = $request->photo->storeAs('images', 'filename.jpg');
$path = $request->photo->storeAs('images', 'filename.jpg', 's3');
Комментарии (6)
Ссылка на api класса UploadedFile не работает.
У меня открывается.
Уже исправили
Не понятно что нужно подключать \Request или \Illuminate\Http\Request ? И не понятно как получить доступ к данным сохранённым в сессии Request::flash() ?
Блин я так понял laravel использует Symfony и теперь еще учить и его надо http://api.symfony.com/3.0/Symfony/Component/HttpFoundation/Cookie.html