Может войдёшь?
Черновики Написать статью Профиль

Запросы и ввод

перевод документация 5.х

  1. 1. Получение экземпляра запроса
    1. 1.1. Методы и путь запроса
    2. 1.2. Запросы PSR-7
  2. 2. Получение ввода
    1. 2.1. Старый ввод
    2. 2.2. Cookies
    3. 2.3. Файлы
    4. 2.4. Получение загруженных файлов
    5. 2.5. Хранение загруженных файлов
Этот перевод актуален для англоязычной документации на (ветка 5.3) , (ветка 5.2) , (ветка 5.1) и (ветка 5.0). Опечатка? Выдели и нажми Ctrl+Enter.

Получение экземпляра запроса

Для получения экземпляра текущего HTTP-запроса через внедрение зависимости вам надо указать тип класса в методе вашего контроллера. Экземпляр входящего запроса будет автоматически внедрён сервис-контейнером:

PHP
<?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');

    
//
  
}
}

Внедрение зависимости и параметры маршрута

Если метод вашего контроллера также ожидает ввода из параметров маршрута, вам надо перечислить параметры вашего маршрута после других зависимостей. Например, если ваш маршрут определён вот так:

PHP
Route::put('user/{id}''UserController@update');

То вы так же можете указать тип Illuminate\Http\Request и получить параметр id вашего маршрута, определив метод вашего контроллера таким образом:

PHP
<?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.3 ()

Обращение к запросу через замыкания маршрутов

Также вы можете указать тип класса Illuminate\Http\Request в замыкании маршрута. Сервис-контейнер автоматически внедрит входящий запрос в замыкание при его выполнении:

PHP
use Illuminate\Http\Request;

Route::get('/', function (Request $request) {
  
//
});
+ 5.0

добавлено в 5.0 ()

Через фасад
Фасад Request предоставит вам доступ к текущему запросу, который привязан в контейнере. Например:

PHP
$name Request::input('name');

Помните, если ваш код находится в собственном пространстве имён, то вам надо будет импортировать фасад Request с помощью оператора PHPuse Request; в начале вашего файла.

Методы и путь запроса

Экземпляр класса Illuminate\Http\Request содержит множество методов для изучения входящего в ваше приложение запроса. Он наследует класс PHPSymfony\Component\HttpFoundation\Request. Ниже мы обсудим несколько наиболее полезных методов этого класса.

Получение URI (пути) запроса

Метод PHPpath() возвращает информацию о пути запроса. Например, если входящий запрос обращён к http://domain.com/foo/bar, то метод PHPpath() вернёт foo/bar:

PHP
$uri $request->path();

Метод PHPis() позволяет проверить соответствие пути запроса заданной маске. При использовании этого метода можно использовать символ * в качестве маски:

PHP
if ($request->is('admin/*')) {
  
//
}

Получение URL запроса

Для получения полного URL без строки запроса используйте метод PHPurl():

PHP
// без строки запроса...
$url $request->url();
+ 5.3 5.2

добавлено в 5.3 () 5.2 ()

Для получения полного URL со строкой запроса служит метод PHPfullUrl():

PHP
// со строкой запроса...
$url $request->fullUrl();
+ 5.2

добавлено в 5.2 ()

Также вы можете получить полный URL и добавить параметры запроса. Например, если запрос направлен к http://domain.com/foo, то такой метод вернёт http://domain.com/foo?bar=baz:

PHP
$url $request->fullUrlWithQuery(['bar' => 'baz']);

Получение метода запроса

Метод PHPmethod() вернёт HTTP-действие запроса. Вы можете использовать метод PHPisMethod() для проверки соответствия HTTP-действия заданной строке:

PHP
$method $request->method();

if (
$request->isMethod('post')) {
  
//
}
+ 5.0

добавлено в 5.0 ()

Получение URI (пути) запроса

PHP
$uri Request::path();

Соответствует ли запрос маске пути?

PHP
if (Request::is('admin/*'))
{
  
//
}

Получение URL запроса

PHP
$url Request::url();

Сделан ли запрос через AJAX?

PHP
if (Request::ajax())
{
  
//
}

Получение метода запроса

PHP
$method Request::method();

if (
Request::isMethod('post'))
{
  
//
}

Запросы 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, указав интерфейс запроса в замыкании вашего маршрута или методе контроллера:

PHP
use Psr\Http\Message\ServerRequestInterface;

Route::get('/', function (ServerRequestInterface $request) {
  
//
});

Если вы возвращаете экземпляр отклика PSR-7 из маршрута или контроллера, он будет автоматически конвертирован обратно в экземпляр отклика Laravel и будет отображён фреймворком.

Получение ввода

Получение всех данных ввода

Вы можете получить все данные ввода в виде массива с помощью метода PHPall():

PHP
$input $request->all();

Получение значения из ввода

Вы можете получить доступ ко всем введённым данным из экземпляра Illuminate\Http\Request, используя всего несколько простых методов. Вам не нужно думать о том, какой тип HTTP-запроса был использован (GET, POST и т.д.) — метод PHPinput() работает одинаково для любого из них:

PHP
$name $request->input('name');
+ 5.1 5.0

добавлено в 5.1 () 5.0 ()

Другой вариант — использовать свойства экземпляра Illuminate\Http\Request для доступа к вводу пользователя. Например, если в одной из форм вашего приложения есть поле name, вы можете обратиться к введённому значению таким образом:

PHP
$name $request->name;

Вы можете передать значение по умолчанию вторым аргументом метода PHPinput(). Это значение будет возвращено, когда запрашиваемый ввод отсутствует в запросе:

PHP
$name $request->input('name''Sally');

При работе с формами, имеющими переменные-массивы, вы можете использовать точечную запись для обращения к массивам:

PHP
$name $request->input('products.0.name');

$names $request->input('products.*.name');
+ 5.3 5.2

добавлено в 5.3 () 5.2 ()

Получение ввода через динамические свойства

Также вы можете получать пользовательский ввод, используя динамический свойства экземпляра Illuminate\Http\Request. Например, если одна из форм приложения содержит поле name, вы можете получить значение отправленного поля вот так:

PHP
$name $request->name;

При использовании динамических свойств Laravel сначала ищет значение параметра в данных запроса. Если его там нет, Laravel будет искать поле в параметрах маршрута.

Получения значения из ввода JSON

При отправке JSON-запросов в приложение вы можете получить доступ к JSON-данным методом PHPinput(), поскольку заголовок Content-Type запроса установлен в application/json. Вы даже можете использовать «точечный» синтаксис, чтобы погружаться в массивы JSON:

PHP
$name $request->input('user.name');

Определение наличия значения переменной

Для определения наличия значения в запросе используйте метод PHPhas(). Метод PHPhas() возвращает true, если значение существует и является непустой строкой:

PHP
if ($request->has('name')) {
  
//
}

Получение части переменных запроса

Если вам необходимо получить только часть данных ввода, используйте методы PHPonly() и PHPexcept(). Оба этих метода принимают один массив или динамический список аргументов:

PHP
$input $request->only(['username''password']);

$input $request->only('username''password');

$input $request->except(['credit_card']);

$input $request->except('credit_card');
+ 5.0

добавлено в 5.0 ()

Получение переменной

PHP
$name Request::input('name');

Получение переменной или значения по умолчанию, если переменная не была передана

PHP
$name Request::input('name''Sally');

Была ли передана переменная?

PHP
if (Request::has('name'))
{
  
//
}

Получение всех переменных запроса

PHP
$input Request::all();

Получение некоторых переменных

PHP
$input Request::only('username''password');

$input Request::except('credit_card');

При работе с переменными-массивами вы можете использовать точечную запись для доступа к их элементам:

PHP
$input Request::input('products.0.name');

Старый ввод

Вам может пригодиться сохранение пользовательского ввода между двумя запросами. Например, после проверки формы на корректность вы можете заполнить её старыми значениями в случае ошибки. Однако, если вы используете включённые в Laravel возможности проверки ввода, то вряд ли вам понадобиться использовать эти методы вручную, так как встроенные возможности Laravel вызовут их автоматически.

Передача ввода в сессию

Метод PHPflash() класса Illuminate\Http\Request передаст текущий ввод в сессию, и он будет доступен во время следующего пользовательского запроса к приложению:

PHP
$request->flash();
+ 5.0

добавлено в 5.0 ()

PHP
Request::flash();

Для передачи некоторых переменных в сессию используйте методы PHPflashOnly() и PHPflashExcept(). Эти методы полезны для хранения важной информации (например, паролей) вне сессии:

PHP
//для версии 5.2 и выше:
$request->flashOnly(['username''email']);

//для версии 5.1 и ранее:
//$request->flashOnly('username', 'email');

$request->flashExcept('password');
+ 5.0

добавлено в 5.0 ()

PHP
Request::flashOnly('username''email');

Request::flashExcept('password');

Передать и перенаправить

Поскольку часто требуется передать ввод в сессии и затем перенаправить на предыдущую страницу, вы можете легко прицепить передачу ввода к перенаправлению с помощью метода PHPwithInput():

PHP
return redirect('form')->withInput();

return 
redirect('form')->withInput(
  
$request->except('password')
);
+ 5.0

добавлено в 5.0 ()

PHP
return redirect('form')->withInput();

return 
redirect('form')->withInput(Request::except('password'));

Получение старого ввода

Для получения переданного ввода из предыдущего запроса используйте метод PHPold() на экземпляре Request. Метод PHPold() получит переданные ранее данные ввода из сессии:

PHP
$username $request->old('username');
+ 5.0

добавлено в 5.0 ()

PHP
$username Request::old('username');

В Laravel есть глобальная вспомогательная функция PHPold(). Когда вы выводите старый ввод в шаблоне Blade, удобнее использовать эту функцию PHPold. Если для данного поля нет старого ввода, вернётся PHPnull:

PHP
//для версии 5.2 и выше:
<input type="text" name="username" value="{{ old('username') }}">

//для версии 5.1 и ранее:
//{{ old('username') }}

Cookies

Получение Cookies из запросов

Все cookie, создаваемые Laravel, шифруются и подписываются специальным кодом — таким образом, если клиент изменит их значение, то они станут недействительными. Для получения значения cookie из запроса используйте метод PHPcookie() на экземпляре Illuminate\Http\Request:

PHP
$value $request->cookie('name');
+ 5.0

добавлено в 5.0 ()

PHP
$value Request::cookie('name');
+ 5.3

добавлено в 5.3 ()

Добавление cookie к ответу

Вы можете прикрепить cookie к исходящему экземпляру Illuminate\Http\Response с помощью метода PHPcookie(). Вы должны передать в этот метод имя, значение и количество минут, в течение которого cookie должен считаться действующим:

PHP
return response('Hello World')->cookie(
  
'name''value'$minutes
);

Метод PHPcookie() также принимает ещё несколько аргументов, используемых менее часто. В целом эти аргументы имеют то же назначение и значение, что и передаваемые в PHP-метод setcookie аргументы:

PHP
return response('Hello World')->cookie(
  
'name''value'$minutes$path$domain$secure$httpOnly
);

Генерация экземпляров Cookie

Если вы хотите сгенерировать экземпляр Symfony\Component\HttpFoundation\Cookie, который позднее можно будет передать экземпляру отклика, используйте глобальную вспомогательную функцию PHPcookie(). Этот cookie не будет отправлен обратно клиенту до тех пор, пока не будет прикреплён к экземпляру отклика:

PHP
$cookie cookie('name''value'$minutes);

return 
response('Hello World')->cookie($cookie);
+ 5.2 5.1 5.0

добавлено в 5.2 () 5.1 () 5.0 ()

Добавление cookie к ответу
Глобальная вспомогательная функция PHPcookie() служит простой фабрикой для генерирования экземпляров Symfony\Component\HttpFoundation\Cookie. Сookie можно прикреплять к экземпляру Illuminate\Http\Response с помощью метода PHPwithCookie():

PHP
$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:

PHP
$response->withCookie(cookie()->forever('name''value'));
+ 5.0

добавлено в 5.0 ()

Добавление cookie в очередь

Вы также можете поставить cookie в очередь для добавления к исходящему ответу, даже до того как этот ответ был создан:

PHP
<?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 и предоставляет различные методы для взаимодействия с файлами:

PHP
$file $request->file('photo');

$file $request->photo;
+ 5.0

добавлено в 5.0 ()

PHP
$file Request::file('photo');

Определение наличия файла

Также вы можете определить, есть ли в запросе файл, с помощью метода PHPhasFile():

PHP
if ($request->hasFile('photo')) {
  
//
}
+ 5.0

добавлено в 5.0 ()

PHP
if (Request::hasFile('photo'))
{
  
//
}

Прошёл ли загруженный файл проверку?

Вдобавок к проверке наличия файла вы можете проверить, что при загрузке файла не возникло никаких проблем, с помощью метода PHPisValid():

PHP
if ($request->file('photo')->isValid()) {
  
//
}
+ 5.0

добавлено в 5.0 ()

PHP
if (Request::file('photo')->isValid())
{
  
//
}
+ 5.3

добавлено в 5.3 ()

Путь и расширение файла
В классе UploadedFile также есть методы для получения полного пути файла и его расширения. Метод PHPextension() пытается определить расширение файла на основе его содержимого. Это расширение может отличаться от указанного клиентом:

PHP
$path $request->photo->path();

$extension $request->photo->extension();
+ 5.2 5.1 5.0

добавлено в 5.2 () 5.1 () 5.0 ()

Перемещение загруженного файла

Для перемещения загруженного файла в новое место используйте метод PHPmove(). Этот метод переместит файл из его временного места хранения (определённого в ваших настройках PHP) на место постоянного хранения по вашему выбору:

PHP
$request->file('photo')->move($destinationPath);

$request->file('photo')->move($destinationPath$fileName);
+ 5.0

добавлено в 5.0 ()

PHP
Request::file('photo')->move($destinationPath);

Request::file('photo')->move($destinationPath$fileName);

Другие методы для работы с файлами

Есть множество других методов для экземпляров UploadedFile. Загляните в документацию по API класса за более подробной информацией об этих методах.

+ 5.3

добавлено в 5.3 ()

Хранение загруженных файлов

Для хранения загруженного файла обычно используется одна из настроенных файловых систем. В классе UploadedFile есть метод PHPstore(), который переместит загруженный файл на один из ваших дисков, который может располагаться в вашей локальной файловой системе или даже в облачном хранилище, таком как Amazon S3.

Метод PHPstore() принимает путь, куда необходимо сохранить файл относительно настроенного корневого каталога файловой системы. Этот путь не должен включать имя файла, поскольку будет автоматически сгенерирован UUID в качестве имени файла.

Также метод PHPstore() принимает второй необязательный аргумент — имя диска для сохранения файла. Этот метод вернёт путь файла относительно корня диска:

PHP
$path $request->photo->store('images');

$path $request->photo->store('images''s3');

Если вы не хотите автоматически генерировать имя файла, используйте метод PHPstoreAs(), который принимает аргументы: путь, имя файла и имя диска:

PHP
$path $request->photo->storeAs('images''filename.jpg');

$path $request->photo->storeAs('images''filename.jpg''s3');

Комментарии (6)

VladKolodka

Ссылка на api класса UploadedFile не работает.

Proger_XP

У меня открывается.

VladKolodka

Уже исправили

potMaster

Не понятно что нужно подключать \Request или \Illuminate\Http\Request ? И не понятно как получить доступ к данным сохранённым в сессии Request::flash() ?

Vijit

как получить доступ к данным сохранённым в сессии Request::flash() Старый ввод

blackdark20

Блин я так понял laravel использует Symfony и теперь еще учить и его надо http://api.symfony.com/3.0/Symfony/Component/HttpFoundation/Cookie.html

Написать комментарий

Разметка: ? ?

Авторизуйся, чтобы прокомментировать.