{{TOC}} {{DOCVER 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51, 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15, 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11}} == Получение экземпляра запроса == Для получения экземпляра текущего HTTP-запроса через внедрение зависимости вам надо указать тип класса в методе вашего контроллера. Экземпляр входящего запроса будет автоматически внедрён ((/docs/v5/container сервис-контейнером)): %% input('name'); // } } %% **Внедрение зависимости и параметры маршрута** Если метод вашего контроллера также ожидает ввода из параметров маршрута, вам надо перечислить параметры вашего маршрута после других зависимостей. Например, если ваш маршрут определён вот так: %% Route::put('user/{id}', 'UserController@update'); %% То вы так же можете указать тип %%(t)Illuminate\Http\Request%% и получить параметр %%(t)id%% вашего маршрута, определив метод вашего контроллера таким образом: %% path(); %% Метод %%is()%% позволяет проверить соответствие пути запроса заданной маске. При использовании этого метода можно использовать символ ***** в качестве маски: %% if ($request->is('admin/*')) { // } %% **Получение URL запроса** Для получения полного URL без строки запроса используйте метод %%url()%%: %% // без строки запроса... $url = $request->url(); %% %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51, 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) Для получения полного URL со строкой запроса служит метод %%fullUrl()%%: ~%% // со строкой запроса... $url = $request->fullUrl(); ~%% %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) Также вы можете получить полный URL и добавить параметры запроса. Например, если запрос направлен к %%(t)http://domain.com/foo%%, то такой метод вернёт %%(t)http://domain.com/foo?bar=baz%%: ~%% $url = $request->fullUrlWithQuery(['bar' => 'baz']); ~%% %% **Получение метода запроса** Метод %%method()%% вернёт HTTP-действие запроса. Вы можете использовать метод %%isMethod()%% для проверки соответствия HTTP-действия заданной строке: %% $method = $request->method(); if ($request->isMethod('post')) { // } %% %%(DOCNEW 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) **Получение URI (пути) запроса** ~%% $uri = Request::path(); ~%% **Соответствует ли запрос маске пути?** ~%% if (Request::is('admin/*')) { // } ~%% **Получение URL запроса** ~%% $url = Request::url(); ~%% **Сделан ли запрос через AJAX?** ~%% if (Request::ajax()) { // } ~%% **Получение метода запроса** ~%% $method = Request::method(); if (Request::isMethod('post')) { // } ~%% %% === Запросы PSR-7 === Стандарт ((http://www.php-fig.org/psr/psr-7/ PSR-7)) описывает интерфейсы для HTTP-сообщений, включая запросы и отклики. Если вы хотите получить экземпляр запроса PSR-7 вместо Laravel-запроса, сначала вам надо установить несколько библиотек. Laravel использует компонент **Symfony HTTP Message Bridge** для конвертации обычных запросов и откликов Laravel в совместимые с PSR-7: %%(sh) composer require symfony/psr-http-message-bridge composer require zendframework/zend-diactoros %% Когда вы установите эти библиотеки, вы можете получить запрос PSR-7, указав интерфейс запроса в замыкании вашего маршрута или методе контроллера: %% use Psr\Http\Message\ServerRequestInterface; Route::get('/', function (ServerRequestInterface $request) { // }); %% .(alert) Если вы возвращаете экземпляр отклика PSR-7 из маршрута или контроллера, он будет автоматически конвертирован обратно в экземпляр отклика Laravel и будет отображён фреймворком. == Получение ввода == **Получение всех данных ввода** Вы можете получить все данные ввода в виде массива с помощью метода %%all()%%: %% $input = $request->all(); %% **Получение значения из ввода** Вы можете получить доступ ко всем введённым данным из экземпляра %%(t)Illuminate\Http\Request%%, используя всего несколько простых методов. Вам не нужно думать о том, какой тип HTTP-запроса был использован (%%(t)GET%%, %%(t)POST%% и т.д.) - метод %%input()%% работает одинаково для любого из них: %% $name = $request->input('name'); %% %%(DOCNEW 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) Другой вариант - использовать свойства экземпляра %%(t)Illuminate\Http\Request%% для доступа к вводу пользователя. Например, если в одной из форм вашего приложения есть поле %%(t)name%%, вы можете обратиться к введённому значению таким образом: ~%% $name = $request->name; ~%% %% Вы можете передать значение по умолчанию вторым аргументом метода %%input()%%. Это значение будет возвращено, когда запрашиваемый ввод отсутствует в запросе: %% $name = $request->input('name', 'Sally'); %% При работе с формами, имеющими переменные-массивы, вы можете использовать точечную запись для обращения к массивам: %% $name = $request->input('products.0.name'); $names = $request->input('products.*.name'); %% %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51, 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) **Получение ввода через динамические свойства** Также вы можете получать пользовательский ввод, используя динамический свойства экземпляра %%(t)Illuminate\Http\Request%%. Например, если одна из форм приложения содержит поле %%(t)name%%, вы можете получить значение отправленного поля вот так: ~%% $name = $request->name; ~%% При использовании динамических свойств Laravel сначала ищет значение параметра в данных запроса. Если его там нет, Laravel будет искать поле в параметрах маршрута. **Получения значения из ввода JSON** При отправке JSON-запросов в приложение вы можете получить доступ к JSON-данным методом %%input()%%, поскольку заголовок %%(t)Content-Type%% запроса установлен в %%(t)application/json%%. Вы даже можете использовать "точечный" синтаксис, чтобы погружаться в массивы JSON: ~%% $name = $request->input('user.name'); ~%% %% **Определение наличия значения переменной** Для определения наличия значения в запросе используйте метод %%has()%%. Метод %%has()%% возвращает %%(t)true%%, если значение существует **и** является непустой строкой: %% if ($request->has('name')) { // } %% **Получение части переменных запроса** Если вам необходимо получить только часть данных ввода, используйте методы %%only()%% и %%except()%%. Оба этих метода принимают один массив или динамический список аргументов: %% $input = $request->only(['username', 'password']); $input = $request->only('username', 'password'); $input = $request->except(['credit_card']); $input = $request->except('credit_card'); %% %%(DOCNEW 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) **Получение переменной** ~%% $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 ((/docs/v5/validation возможности проверки ввода)), то вряд ли вам понадобиться использовать эти методы вручную, так как встроенные возможности Laravel вызовут их автоматически. **Передача ввода в сессию** Метод %%flash()%% класса %%(t)Illuminate\Http\Request%% передаст текущий ввод в ((/docs/v5/session сессию)), и он будет доступен во время следующего пользовательского запроса к приложению: %% $request->flash(); %% %%(DOCNEW 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) ~%% Request::flash(); ~%% %% Для передачи некоторых переменных в сессию используйте методы %%flashOnly()%% и %%flashExcept()%%. Эти методы полезны для хранения важной информации (например, паролей) вне сессии: %% //для версии 5.2 и выше: $request->flashOnly(['username', 'email']); //для версии 5.1 и ранее: //$request->flashOnly('username', 'email'); $request->flashExcept('password'); %% %%(DOCNEW 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) ~%% Request::flashOnly('username', 'email'); Request::flashExcept('password'); ~%% %% **Передать и перенаправить** Поскольку часто требуется передать ввод в сессии и затем перенаправить на предыдущую страницу, вы можете легко прицепить передачу ввода к перенаправлению с помощью метода %%withInput()%%: %% return redirect('form')->withInput(); return redirect('form')->withInput( $request->except('password') ); %% %%(DOCNEW 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) ~%% return redirect('form')->withInput(); return redirect('form')->withInput(Request::except('password')); ~%% %% **Получение старого ввода** Для получения переданного ввода из предыдущего запроса используйте метод %%old()%% на экземпляре %%(t)Request%%. Метод %%old()%% получит переданные ранее данные ввода из ((/docs/v5/session сессии)): %% $username = $request->old('username'); %% %%(DOCNEW 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) ~%% $username = Request::old('username'); ~%% %% В Laravel есть глобальная вспомогательная функция %%old()%%. Когда вы выводите старый ввод в ((//docs/v5/blade шаблоне Blade)), удобнее использовать эту функцию %%old%%. Если для данного поля нет старого ввода, вернётся %%null%%: %% //для версии 5.2 и выше: //для версии 5.1 и ранее: //{{ old('username') }} %% === Cookies === **Получение Cookies из запросов** Все cookie, создаваемые Laravel, шифруются и подписываются специальным кодом - таким образом, если клиент изменит их значение, то они станут недействительными. Для получения значения cookie из запроса используйте метод %%cookie()%% на экземпляре %%(t)Illuminate\Http\Request%%: %% $value = $request->cookie('name'); %% %%(DOCNEW 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) ~%% $value = Request::cookie('name'); ~%% %% %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) **Добавление cookie к ответу** Вы можете прикрепить cookie к исходящему экземпляру %%(t)Illuminate\Http\Response%% с помощью метода %%cookie()%%. Вы должны передать в этот метод имя, значение и количество минут, в течение которого cookie должен считаться действующим: ~%% return response('Hello World')->cookie( 'name', 'value', $minutes ); ~%% Метод %%cookie()%% также принимает ещё несколько аргументов, используемых менее часто. В целом эти аргументы имеют то же назначение и значение, что и передаваемые в PHP-метод ((https://secure.php.net/manual/en/function.setcookie.php setcookie)) аргументы: ~%% return response('Hello World')->cookie( 'name', 'value', $minutes, $path, $domain, $secure, $httpOnly ); ~%% **Генерация экземпляров Cookie** Если вы хотите сгенерировать экземпляр %%(t)Symfony\Component\HttpFoundation\Cookie%%, который позднее можно будет передать экземпляру отклика, используйте глобальную вспомогательную функцию %%cookie()%%. Этот cookie не будет отправлен обратно клиенту до тех пор, пока не будет прикреплён к экземпляру отклика: ~%% $cookie = cookie('name', 'value', $minutes); return response('Hello World')->cookie($cookie); ~%% %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15, 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) **Добавление cookie к ответу** Глобальная вспомогательная функция %%cookie()%% служит простой фабрикой для генерирования экземпляров %%(t)Symfony\Component\HttpFoundation\Cookie%%. Сookie можно прикреплять к экземпляру %%(t)Illuminate\Http\Response%% с помощью метода %%withCookie()%%: ~%% $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 лет, используйте метод %%forever()%% на фабрике cookie, сначала вызвав метод %%cookie()%% без аргументов, а затем "прицепить" метод %%forever()%% к возвращённой фабрике cookie: ~%% $response->withCookie(cookie()->forever('name', 'value')); ~%% %% %%(DOCNEW 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) **Добавление cookie в очередь** Вы также можете поставить cookie в очередь для добавления к исходящему ответу, даже до того как этот ответ был создан: ~%% file('photo'); $file = $request->photo; %% %%(DOCNEW 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) ~%% $file = Request::file('photo'); ~%% %% **Определение наличия файла** Также вы можете определить, есть ли в запросе файл, с помощью метода %%hasFile()%%: %% if ($request->hasFile('photo')) { // } %% %%(DOCNEW 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) ~%% if (Request::hasFile('photo')) { // } ~%% %% **Прошёл ли загруженный файл проверку?** Вдобавок к проверке наличия файла вы можете проверить, что при загрузке файла не возникло никаких проблем, с помощью метода %%isValid()%%: %% if ($request->file('photo')->isValid()) { // } %% %%(DOCNEW 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) ~%% if (Request::file('photo')->isValid()) { // } ~%% %% %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) **Путь и расширение файла** В классе %%(t)UploadedFile%% также есть методы для получения полного пути файла и его расширения. Метод %%extension()%% пытается определить расширение файла на основе его содержимого. Это расширение может отличаться от указанного клиентом: ~%% $path = $request->photo->path(); $extension = $request->photo->extension(); ~%% %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15, 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) **Перемещение загруженного файла** Для перемещения загруженного файла в новое место используйте метод %%move()%%. Этот метод переместит файл из его временного места хранения (определённого в ваших настройках PHP) на место постоянного хранения по вашему выбору: ~%% $request->file('photo')->move($destinationPath); $request->file('photo')->move($destinationPath, $fileName); ~%% %% %%(DOCNEW 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) ~%% Request::file('photo')->move($destinationPath); Request::file('photo')->move($destinationPath, $fileName); ~%% %% **Другие методы для работы с файлами** Есть множество других методов для экземпляров %%(t)UploadedFile%%. Загляните в ((http://api.symfony.com/3.0/Symfony/Component/HttpFoundation/File/UploadedFile.html документацию по API класса)) за более подробной информацией об этих методах. %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) === Хранение загруженных файлов === Для хранения загруженного файла обычно используется одна из настроенных ((//docs/v5/filesystem файловых систем)). В классе %%(t)UploadedFile%% есть метод %%store()%%, который переместит загруженный файл на один из ваших дисков, который может располагаться в вашей локальной файловой системе или даже в облачном хранилище, таком как Amazon S3. Метод %%store()%% принимает путь, куда необходимо сохранить файл относительно настроенного корневого каталога файловой системы. Этот путь не должен включать имя файла, поскольку будет автоматически сгенерирован UUID в качестве имени файла. Также метод %%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'); ~%% %%