Создание ответов
Строки и массивы
Все маршруты и контроллеры должны возвращать ответ для отправки обратно в браузер пользователя. Laravel предоставляет несколько разных способов возврата ответов. Самый простой ответ - возврат строки из маршрута или контроллера. Фреймворк автоматически преобразует строку в полный HTTP-ответ:
Route::get('/', function () {
return 'Hello World';
});
Помимо возврата строк из ваших маршрутов и контроллеров, вы также можете возвращать массивы. Фреймворк автоматически преобразует массив в ответ JSON:
Route::get('/', function () {
return [1, 2, 3];
});
Знаете ли вы, что вы также можете вернуть коллекции Eloquent с ваших маршрутов или контроллеров? Они будут автоматически преобразованы в JSON. Дать ему шанс!
Объекты ответа
Как правило, вы не просто будете возвращать простые строки или массивы из действий маршрута. Вместо этого вы будете возвращать полные экземпляры или представления.Illuminate\Http\Response
Возврат полного Response
экземпляра позволяет настроить HTTP-код ответа и заголовки. Response
Экземпляр наследует от класса, который обеспечивает различные методы для построения ответов HTTP:Symfony\Component\HttpFoundation\Response
Route::get('home', function () {
return response('Hello World', 200)
->header('Content-Type', 'text/plain');
});
n
Прикрепление заголовков к ответам
Имейте в виду, что большинство методов ответа являются цепочечными, что позволяет быстро создавать экземпляры ответов. Например, вы можете использовать header
метод, чтобы добавить серию заголовков в ответ перед отправкой его обратно пользователю:
return response($content)
->header('Content-Type', $type)
->header('X-Header-One', 'Header Value')
->header('X-Header-Two', 'Header Value');
Или вы можете использовать withHeaders
метод для указания массива заголовков, которые будут добавлены в ответ:
return response($content)
->withHeaders([
'Content-Type' => $type,
'X-Header-One' => 'Header Value',
'X-Header-Two' => 'Header Value',
]);
Промежуточное ПО для управления кэшем
Laravel включает промежуточное программное обеспечение, которое можно использовать для быстрой установки заголовка для группы маршрутов. Если указано в списке директив, MD5-хэш содержимого ответа будет автоматически установлен в качестве идентификатора ETag:cache.headers
Cache-Control
etag
Route::middleware('cache.headers:public;max_age=2628000;etag')->group(function() {
Route::get('privacy', function () {
// ...
});
Route::get('terms', function () {
// ...
});
});
Прикрепление файлов cookie к ответам
cookie
Метод по инстанциям ответа позволяет легко прикрепить печенье к ответу. Например, вы можете использовать cookie
метод для создания файла cookie и легко прикрепить его к экземпляру ответа, например так:
return response($content)
->header('Content-Type', $type)
->cookie('name', 'value', $minutes);
cookie
Метод также принимает несколько аргументов , которые используются реже. Как правило, эти аргументы имеют ту же цель и значение, что и аргументы, которые будут переданы нативномуметоду setcookie в PHP :
->cookie($name, $value, $minutes, $path, $domain, $secure, $httpOnly)
Кроме того, вы можете использовать Cookie
фасад, чтобы «поставить в очередь» файлы cookie для прикрепления к исходящему ответу из вашего приложения. queue
Метод принимает Cookie
экземпляр или аргументы , необходимые для создания Cookie
экземпляра. Эти файлы cookie будут прикреплены к исходящему ответу до его отправки в браузер:
Cookie::queue(Cookie::make('name', 'value', $minutes));
Cookie::queue('name', 'value', $minutes);
Файлы cookie и шифрование
По умолчанию все файлы cookie, сгенерированные Laravel, зашифрованы и подписаны, поэтому они не могут быть изменены или прочитаны клиентом. Если вы хотите отключить шифрование для подмножества файлов cookie, сгенерированных вашим приложением, вы можете использовать $except
свойство промежуточного программного обеспечения, которое находится в каталоге:App\Http\Middleware\EncryptCookies
app/Http/Middleware
/**
* The names of the cookies that should not be encrypted.
*
* @var array
*/
protected $except = [
'cookie_name',
];
Перенаправление
Ответы на перенаправление являются экземплярами класса и содержат надлежащие заголовки, необходимые для перенаправления пользователя на другой URL-адрес. Есть несколько способов создать экземпляр. Самый простой способ - использовать глобальный помощник:Illuminate\Http\RedirectResponse
RedirectResponse
redirect
Route::get('dashboard', function () {
return redirect('home/dashboard');
});
Иногда вы можете захотеть перенаправить пользователя на прежнее место, например, когда отправленная форма недействительна. Вы можете сделать это с помощью глобальной back
вспомогательной функции. Поскольку эта функция использует сеанс , убедитесь, что маршрут, вызывающий back
функцию, использует группу web
промежуточного программного обеспечения или применяет все промежуточное программное обеспечение сеанса:
Route::post('user/profile', function () {
// Validate the request...
return back()->withInput();
});
Перенаправление на именованные маршруты
Когда вы вызываете redirect
помощника без параметров, возвращается экземпляр , что позволяет вам вызывать любой метод в экземпляре. Например, чтобы создать именованный маршрут, вы можете использовать метод:Illuminate\Routing\Redirector
Redirector
RedirectResponse
route
return redirect()->route('login');
Если у вашего маршрута есть параметры, вы можете передать их в качестве второго аргумента route
методу:
// For a route with the following URI: profile/{id}
return redirect()->route('profile', ['id' => 1]);
Заполнение параметров с помощью красноречивых моделей
Если вы перенаправляете на маршрут с параметром «ID», который заполняется из модели Eloquent, вы можете передать саму модель. Идентификатор будет извлечен автоматически:
// For a route with the following URI: profile/{id}
return redirect()->route('profile', [$user]);
Если вы хотите настроить значение, которое помещается в параметр маршрута, вы должны переопределить getRouteKey
метод в вашей модели Eloquent:
/**
* Get the value of the model's route key.
*
* @return mixed
*/
public function getRouteKey()
{
return $this->slug;
}
Перенаправление на действия контроллера
Вы также можете создавать перенаправления на действия контроллера . Для этого передайте имя контроллера и действия action
методу. Помните, вам не нужно указывать полное пространство имен для контроллера, поскольку Laravel RouteServiceProvider
автоматически установит пространство имен базового контроллера:
return redirect()->action('HomeController@index');
Если ваш маршрут контроллера требует параметров, вы можете передать их в качестве второго аргумента action
методу:
return redirect()->action(
'UserController@profile', ['id' => 1]
);
Перенаправление на внешние домены
Иногда вам может понадобиться перенаправить на домен за пределами вашего приложения. Вы можете сделать это, вызвав away
метод, который создает RedirectResponse
без какой-либо дополнительной кодировки, проверки или проверки URL:
return redirect()->away('https://www.google.com');
Перенаправление с перепрограммированными данными сеанса
Перенаправление на новый URL-адрес и перетаскивание данных в сеанс обычно выполняются одновременно. Обычно это делается после успешного выполнения действия, когда вы отправляете сообщение об успешном завершении сеанса. Для удобства вы можете создать RedirectResponse
экземпляр и перенести данные в сеанс в единую свободную цепочку методов:
Route::post('user/profile', function () {
// Update the user's profile...
return redirect('dashboard')->with('status', 'Profile updated!');
});
После того, как пользователь перенаправлен, вы можете отобразить всплывающее сообщение из сеанса . Например, используя синтаксис Blade :
@if (session('status'))
<div class="alert alert-success">
{{ session('status') }}
</div>
@endif
Другие типы ответов
response
Помощник может быть использован для создания других типов экземпляров ответа. Когда response
помощник вызывается без аргументов, возвращается реализация контракта . Этот контракт предоставляет несколько полезных методов для генерации ответов.Illuminate\Contracts\Routing\ResponseFactory
Посмотреть ответы
Если вам нужен контроль над статусом и заголовками ответа, но также необходимо вернуть представление в качестве содержимого ответа, вы должны использовать view
метод:
return response()
->view('hello', $data, 200)
->header('Content-Type', $type);
Конечно, если вам не нужно передавать собственный код состояния HTTP или пользовательские заголовки, вы должны использовать глобальную view
вспомогательную функцию.
Ответы JSON
json
Метод автоматически устанавливает заголовок , а также преобразовать данный массив JSON с помощью функции PHP:Content-Type
application/json
json_encode
return response()->json([
'name' => 'Abigail',
'state' => 'CA'
]);
Если вы хотите создать ответ JSONP, вы можете использовать json
метод в сочетании с withCallback
методом:
return response()
->json(['name' => 'Abigail', 'state' => 'CA'])
->withCallback($request->input('callback'));
Загрузка файлов
download
Метод может быть использован для создания ответа , который заставляет браузер пользователя , чтобы загрузить файл на данном пути. download
Метод принимает имя файла в качестве второго аргумента метода, который будет определять имя файла, видимый пользователем загрузку файла. Наконец, вы можете передать массив заголовков HTTP в качестве третьего аргумента методу:
return response()->download($pathToFile);
return response()->download($pathToFile, $name, $headers);
return response()->download($pathToFile)->deleteFileAfterSend();
Symfony HttpFoundation, который управляет загрузкой файлов, требует, чтобы загружаемый файл имел имя файла ASCII.
Потоковые загрузки
Иногда вы можете захотеть превратить строковый ответ данной операции в загружаемый ответ без необходимости записывать содержимое операции на диск. Вы можете использовать streamDownload
метод в этом сценарии. Этот метод принимает в качестве аргументов обратный вызов, имя файла и необязательный массив заголовков:
return response()->streamDownload(function () {
echo GitHub::api('repo')
->contents()
->readme('laravel', 'laravel')['contents'];
}, 'laravel-readme.md');
Ответы файла
Этот file
метод может использоваться для отображения файла, такого как изображение или PDF, непосредственно в браузере пользователя вместо инициирования загрузки. Этот метод принимает путь к файлу в качестве первого аргумента и массив заголовков в качестве второго аргумента:
return response()->file($pathToFile);
return response()->file($pathToFile, $headers);
Макросы ответа
Если вы хотите определить пользовательский ответ, который вы можете повторно использовать в различных ваших маршрутах и контроллерах, вы можете использовать macro
метод на Response
фасаде. Например, из метода поставщика услуг boot
:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Response;
class ResponseMacroServiceProvider extends ServiceProvider
{
/**
* Register the application's response macros.
*
* @return void
*/
public function boot()
{
Response::macro('caps', function ($value) {
return Response::make(strtoupper($value));
});
}
}
macro
Функция принимает имя в качестве первого аргумента, и его закрытия в качестве второго. Закрытие макроса будет выполнено при вызове имени макроса из ResponseFactory
реализации или response
помощника:
return response()->caps('foo');
0 комментариев