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

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

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

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

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

Через внедрение зависимости

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

PHP
<?php

namespace App\Http\Controllers;

use 
Illuminate\Http\Request;
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;
use 
Illuminate\Routing\Controller;

class 
UserController extends Controller
{
  
/**
   * Обновить указанного пользователя.
   *
   * @param  Request  $request
   * @param  int  $id
   * @return Response
   */
  
public function update(Request $request$id)
  {
    
//
  
}
}
+ 5.0

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

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

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

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

Основная информация о запросе

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

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

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

PHP
$uri $request->path();

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

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

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

PHP
$url $request->url();

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

Метод 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 использует компонент 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 и будет отображён фреймворком.

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

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

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

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

PHP
$name $request->name;

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

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

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

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

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

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

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

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

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

PHP
$input $request->all();

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

Если вам необходимо получить только часть данных ввода, используйте методы 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
$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');

Когда вы выводите старый ввод в шаблоне Blade, удобнее использовать вспомогательную функцию PHPold:

PHP
{{ old('username') }}

Cookies

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

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

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

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

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

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

PHP
$response = new Illuminate\Http\Response('Hello World');

$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');
  }
}

Файлы

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

С помощью метода PHPfile() можно получить доступ к загруженным файлам, входящим в экземпляр Illuminate\Http\Request. Возвращаемый методом PHPfile() объект — экземпляр класса Symfony\Component\HttpFoundation\File\UploadedFile, который наследует PHP-класс SplFileInfo и предоставляет различные методы для взаимодействия с файлами:

PHP
$file $request->file('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())
{
  
//
}

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

Для перемещения загруженного файла в новое место используйте метод 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)

VladKolodka

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

Proger_XP

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

VladKolodka

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

potMaster

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

Vijit

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

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

Разметка: ? ?

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