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

HTTP-отклики

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

  1. 1. Базовые отклики
  2. 2. Другие типы откликов
  3. 3. Переадресация
  4. 4. Макрос отклика
Этот перевод актуален для англоязычной документации на (ветка 5.1) и (ветка 5.0). Опечатка? Выдели и нажми Ctrl+Enter.

Базовые отклики

Разумеется, все маршруты и контроллеры должны возвращать какой-либо отклик для отправки обратно в браузер. Laravel предоставляет несколько разных способов для возврата откликов. Самый основной отклик — простой возврат строки из маршрута или контроллера:

PHP
Route::get('/', function () {
  return 
'Hello World';
});

Фреймворк автоматически конвертирует данную строку в HTTP-отклик.

Но для большинства маршрутов и действий контроллера вы будете возвращать полный объект Illuminate\Http\Response или представление. Возвращая полный экземпляр Response, вы можете изменить код HTTP-статуса и заголовок отклика. Объект Response наследует от класса Symfony\Component\HttpFoundation\Response, предоставляя множество методов для построения HTTP-откликов:

PHP
use Illuminate\Http\Response;

Route::get('home', function () {
  return (new 
Response($content$status))
                ->
header('Content-Type'$value);
});

Для удобства вы можете использовать вспомогательную функцию PHPresponse():

PHP
Route::get('home', function () {
  return 
response($content$status)
                ->
header('Content-Type'$value);
});

Полный список доступных методов класса Response можно найти в документации по его API и в документации по API Symfony.

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

Имейте ввиду, что большинство методов Response сцепляемы, что делает построение откликов более гибким. Например, вы можете использовать метод PHPheader() для добавления нескольких заголовков в отклик перед его отправкой пользователю:

PHP
return response($content)
          ->
header('Content-Type'$type)
          ->
header('X-Header-One''Header Value')
          ->
header('X-Header-Two''Header Value');
+ 5.0

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

Отправка шаблона в отклик

Если вам нужен доступ к методам класса PHPResponse, но вы хотите возвращать шаблон в качестве содержимого отклика, то вы можете использовать метод PHPview() для удобства:

PHP
return response()->view('hello')->header('Content-Type'$type);

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

Использование вспомогательного метода PHPwithCookie() на экземпляре отклика позволяет вам легко добавить cookie в отклик. Например, вы можете использовать метод PHPwithCookie() для создания cookie и добавления его в экземпляр отклика:

PHP
return response($content)->header('Content-Type'$type)
               ->
withCookie('name''value');

Метод PHPwithCookie() принимает дополнительные необязательные аргументы для настройки свойств cookie:

PHP
->withCookie($name$value$minutes$path$domain$secure$httpOnly)

По умолчанию все генерируемые cookie в Laravel шифруются и подписываются, поэтому они не могут быть прочитаны или изменены клиентом. Если вы хотите отключить шифрование для определённого набора cookie в вашем приложении, вы можете использовать свойство PHP$except посредника App\Http\Middleware\EncryptCookies:

PHP
/**
 * Названия тех cookie, которые не надо шифровать.
 *
 * @var array
 */
protected $except = [
  
'cookie_name',
];

Другие типы откликов

Метод PHPresponse() можно использовать для удобного создания экземпляров откликов других типов. Когда PHPresponse() вызывается без аргументов, возвращается реализация контракта Illuminate\Contracts\Routing\ResponseFactory. Этот контракт предоставляет несколько полезных методов для создания откликов.

Отклики представления

Если вам необходим контроль над статусом и заголовком отклика, но при этом необходимо возвращать представление в качестве содержимого отклика, используйте метод PHPview():

PHP
return response()->view('hello'$data)->header('Content-Type'$type);

Конечно, если вам не надо передавать свой код HTTP-статуса и свои заголовки, вы можете просто использовать глобальную функцию PHPview().

JSON-отклики

Метод PHPjson() автоматически задаст заголовок Content-Type для application/json, а также конвертирует данный массив в JSON при помощи PHP-функции PHPjson_encode():

PHP
return response()->json(['name' => 'Abigail''state' => 'CA']);

Если вы хотите создать JSONP-отклик, используйте метод PHPjson() совместно с PHPsetCallback():

PHP
return response()->json(['name' => 'Abigail''state' => 'CA'])
               ->
setCallback($request->input('callback'));

Отклик загрузки файла

Метод PHPdownload() используется для создания отклика, получив который, браузер пользователя скачивает файл по указанному пути. Метод PHPdownload() принимает вторым аргументом имя файла, именно это имя увидит пользователь при скачивании файла. И наконец, вы можете передать массив HTTP-заголовков третьим аргументом метода:

PHP
return response()->download($pathToFile);

return 
response()->download($pathToFile$name$headers);

Класс Symfony HttpFoundation, который управляет загрузкой файлов, требует, чтобы загружаемый файл имел ASCII-имя.

Переадресация

Отклики для переадресации — это объекты класса Illuminate\Http\RedirectResponse, и они содержат надлежащие заголовки, необходимые для переадресации пользователя на другой URL. Есть несколько способов создания объекта RedirectResponse. Простейший из них — использовать глобальный вспомогательный метод PHPredirect():

PHP
Route::get('dashboard', function () {
  return 
redirect('home/dashboard');
});

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

PHP
Route::post('user/profile', function () {
  
// Проверка запроса...

  
return back()->withInput();
});

Переадресация на именованный маршрут

Когда вы вызываете функцию PHPredirect() без параметров, возвращается экземпляр Illuminate\Routing\Redirector, позволяя вам вызывать любой метод объекта Redirector. Например, для создания RedirectResponse на именованный маршрут вы можете использовать метод PHProute():

PHP
return redirect()->route('login');

Если у вашего маршрута есть параметры, вы можете передать их в качестве второго аргумента в метод PHProute():

PHP
// Для маршрута с таким URI: profile/{id}

return redirect()->route('profile', [1]);

Если вы переадресовываете на маршрут с параметром «ID», который был взят из модели Eloquent, то вы можете просто передать саму модель. ID будет извлечён автоматически:

PHP
return redirect()->route('profile', [$user]);
+ 5.0

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

Переадресация на именованный маршрут с именованными параметрами

PHP
// Для маршрута с таким URI: profile/{user}

return redirect()->route('profile', ['user' => 1]);

Переадресация на действие контроллера

Также вы можете создать отклик-переадресацию на действие контроллера. Для этого просто передайте контроллер и название действия в метод PHPaction().

+ 5.1

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

Не забудьте, что вам не надо указывать полное пространство имён для контроллера, так как RouteServiceProvider в Laravel автоматически задаёт пространство имён контроллера по умолчанию:

PHP
return redirect()->action('HomeController@index');
+ 5.0

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

PHP
return redirect()->action('App\Http\Controllers\HomeController@index');

Вам не надо указывать полное пространство имён для контроллера, если вы зарегистрировали пространство имён корневого контроллера с помощью PHPURL::setRootControllerNamespace.

Конечно, если маршрут вашего контроллера требует параметров, вы можете передать их вторым аргументом метода PHPaction():

PHP
return redirect()->action('UserController@profile', [1]);
+ 5.0

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

Переадресация на действие контроллера с именованными параметрами

PHP
return redirect()->action('App\Http\Controllers\UserController@profile', ['user' => 1]);

Переадресация с одноразовыми переменными сессии

Переадресация на новый URL и передача данных в сессию обычно происходят в одно время. Поэтому для удобства вы можете создать экземпляр RedirectResponse и передать данные в сессию в одной связке методов. Например, это удобно для сохранения сообщений о статусе после действия:

PHP
Route::post('user/profile', function () {
  
// Обновление профиля пользователя...

  
return redirect('dashboard')->with('status''Profile updated!');
});

Разумеется, когда пользователь переадресован на новую страницу, вы можете получить и вывести одноразовое сообщение из сессии. Например, с помощью синтаксиса Blade:

PHP
@if (session('status'))
  <
div class="alert alert-success">
    {{ 
session('status') }}
  </
div>
@endif

Макрос отклика

Если вы хотите определить собственный отклик, который вы смогли бы использовать повторно в различных маршрутах и контроллерах, то можете использовать метод PHPmacro() на реализации контракта Illuminate\Contracts\Routing\ResponseFactory.

Например, из метода PHPboot() сервис-провайдера:

PHP
<?php

namespace App\Providers;

use 
Illuminate\Support\ServiceProvider;
use 
Illuminate\Contracts\Routing\ResponseFactory;

class 
ResponseMacroServiceProvider extends ServiceProvider
{
  
/**
   * Выполнение загрузки сервисов после регистрации.
   *
   * @param  ResponseFactory  $factory
   * @return void
   */
  
public function boot(ResponseFactory $factory)
  {
    
$factory->macro('caps', function ($value) use ($factory) {
      return 
$factory->make(strtoupper($value));
    });
  }
}

Функция PHPmacro() принимает имя в качестве первого аргумента и замыкание в качестве второго. Замыкание макроса будет выполнено при вызове имени макроса из реализации ResponseFactory: или из метода PHPresponse():

PHP
return response()->caps('foo');

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

Разметка: ? ?

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