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

HTTP-отклики

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

  1. 1. Создание откликов
  2. 2. Переадресация
    1. 2.1. Переадресация на именованный маршрут
    2. 2.2. Переадресация на действие контроллера
    3. 2.3. Переадресация с одноразовыми переменными сессии
  3. 3. Другие типы откликов
    1. 3.1. Отклики представления
    2. 3.2. JSON-отклики
    3. 3.3. Отклик загрузки файла
    4. 3.4. Отклики файлы
  4. 4. Макрос отклика
Этот перевод актуален для англоязычной документации на (ветка 5.3) , (ветка 5.2) , (ветка 5.1) и (ветка 5.0). Опечатка? Выдели и нажми Ctrl+Enter.

Создание откликов

Строки и массивы

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

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

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

Помимо строк из маршрутов и контроллеров можно также возвращать массивы. Фреймворк автоматически конвертирует массив в JSON-отклик:

PHP
Route::get('/', function () {
  return [
123];
});

Вы знали, что вы можете также возвращать коллекции Eloquent из маршрутов и контроллеров? Они будут автоматически сконвертированы в JSON. Попробуйте!

Объекты откликов

Чаще всего вы будете возвращать из действий маршрутов не просто строки или массивы. Вместо этого вы будете возвращать полные экземпляры Illuminate\Http\Response или представления.

Возврат полного экземпляра Response позволяет вам изменять HTTP-код состояния и заголовки откликов. Экземпляр Response наследует класс Symfony\Component\HttpFoundation\Response, который предоставляет множество методов для создания HTTP-откликов:

PHP
Route::get('home', function () {
  return 
response('Hello World'200)
                ->
header('Content-Type''text/plain');
});
+ 5.2 5.1 5.0

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

Объекты откликов

Но для большинства маршрутов и действий контроллера вы будете возвращать полный объект 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.3 5.2

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

Или, вы можете использовать метод PHPwithHeaders() для добавления массива заголовков в отклик:

PHP
return response($content)
          ->
withHeaders([
            
'Content-Type' => $type,
            
'X-Header-One' => 'Header Value',
            
'X-Header-Two' => 'Header Value',
          ]);
+ 5.0

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

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

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

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

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

+ 5.3 5.2

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

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

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

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

PHP
->cookie($name$value$minutes$path$domain$secure$httpOnly)
+ 5.2

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

Или, вы можете использовать метод PHPqueue() фасада Cookie для создания cookie, который будет автоматически добавлен в исходящий отклик:

PHP
<?php

namespace App\Http\Controllers;

use 
Cookie;
use 
App\Http\Controllers\Controller;
class 
DashboardController extends Controller
{
  
/**
   * Показать панель управления приложения.
   *
   * @return Response
   */
  
public function index()
  {
    
Cookie::queue('saw_dashboard'true15);

    return 
view('dashboard');
  }
}

В этом примере cookie saw_dashboard будет автоматически добавлен в исходящий отклик, без необходимости вручную прикреплять cookie к конкретному экземпляру отклика.

+ 5.1 5.0

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

Использование вспомогательного метода 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)

Cookies и шифрование

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

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

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

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

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

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

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', ['id' => 1]);

Заполнение параметров через модели Eloquent

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

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

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

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

Для изменения значения, помещённого в параметр маршрута, переопределите метод PHPgetRouteKey() в вашей модели Eloquent:

PHP
/**
 * Получить значение ключа маршрута модели.
 *
 * @return mixed
 */
public function getRouteKey()
{
  return 
$this->slug;
}
+ 5.0

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

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

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

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

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

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

+ 5.3 5.2 5.1

добавлено в 5.3 () 5.2 () 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', ['id' => 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

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

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

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

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

PHP
return response()
            ->
view('hello'$data200)
            ->
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'])
            ->
withCallback($request->input('callback'));

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

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

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

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

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

+ 5.3 5.2

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

Отклики файлы

Метод PHPfile() служит для вывода файла (такого как изображение или PDF) прямо в браузере пользователя, вместо запуска его скачивания. Этот метод принимает первым аргументом путь к файлу, а вторым аргументом — массив заголовков:

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

return 
response()->file($pathToFile$headers);

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

Если вы хотите определить собственный отклик, который вы смогли бы использовать повторно в различных маршрутах и контроллерах, то можете использовать метод PHPmacro() на фасаде Response. Например, из метода PHPboot() сервис-провайдера:

+ 5.3 5.2

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

PHP
<?php

namespace App\Providers;

use 
Illuminate\Support\Facades\Response;
//для версии 5.2 и ранее:
//use Response;
use Illuminate\Support\ServiceProvider;

class 
ResponseMacroServiceProvider extends ServiceProvider
{
  
/**
   * Регистрация макроса отклика приложения.
   *
   * @return void
   */
  
public function boot()
  {
    
Response::macro('caps', function ($value) {
      return 
Response::make(strtoupper($value));
    });
  }
}
+ 5.1 5.0

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

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

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

Разметка: ? ?

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