git c344e6ca5495ae9bc3f1cc62559b4a750a6c2515
HTTP-Response - это ответ фреймворка, который отдается клиенту (обычно это браузер), от которого пришел HTTP-запрос.
Наиболее простой создать HTTP-ответ - это возвратить строку в роуте или контроллере.
Route::get('/', function()
{
return 'Hello world';
});
Однако чаще в контроллерах вы возвращаете объект Illuminate\Http\Response
или шаблон. Возврат объекта Response
позволяет изменить HTTP-код и заголовки ответа. Этот объект наследуется от Symfony\Component\HttpFoundation\Response
, который предоставляет разнообразные методы для построения HTTP-ответа:
use Illuminate\Http\Response;
return (new Response($content, $status))
->header('Content-Type', $value);
Для удобства вы можете использовать хэлпер response
:
return response($content, $status)
->header('Content-Type', $value);
Примечание: Полный список методов
Response
можно увидеть в документации по API Laravel и документации по API Symfony.
Если вам нужно не просто изменить заголовки, но и вывести какой-то контент, вы можете указать имя шаблона при помощи метода view()
:
return response()->view('hello')->header('Content-Type', $type);
return response($content)->withCookie(cookie('name', 'value'));
Redirect responses are typically instances of the Illuminate\Http\RedirectResponse
class, and contain the proper headers needed to redirect the user to another URL.
Редирект - это объект класса Illuminate\Http\RedirectResponse
, фактически это обычный HTTP-ответ без контента с установленным заголовком Location
.
Есть несколько способов создать объект RedirectResponse
. Самый простой - воспользоваться хэлпером redirect
.
return redirect('user/login');
Редирект с flash-данными в сессии - типичная задача в случае, когда после POST-запроса надо перейти на страницу с формой и показать ошибки валидации. Записать flash-данные в сессию можно при помощи метода with()
:
return redirect('user/login')->with('message', 'Login Failed');
Для перехода назад к форме можно использовать также метод back()
. Метод withInput() передаст данные, которые пришли от этой формы, для того, чтобы отобразить их в форме и не заставлять пользователя снова вносить их.
return redirect()->back();
return redirect()->back()->withInput();
Если использовать хэлпер redirect()
без параметров, он вернет объект Illuminate\Routing\Redirector
, у которого есть несколько интересных методов. При помощи них, например, вы можете сделать редирект на роут по его имено:
return redirect()->route('login');
Если ваш роут содержит параметры, то передать их вы можете так:
return redirect()->route('profile', [1]);
If you are redirecting to a route with an "ID" parameter that is being populated from an Eloquent model, you may simply pass the model itself. The ID will be extracted automatically:
Если параметр роута - это ID некой модели, вы можете передать в аргументе экземпляр этой модели, Laravel возьмет оттуда ID сам:
return redirect()->route('profile', [$user]);
// Если ваш роут с именем 'profile' имеет урл 'profile/{user}':
return redirect()->route('profile', ['user' => 1]);
Вы можете также сделать редирект на экшн заданного контроллера:
return redirect()->action('App\Http\Controllers\HomeController@index');
Примечание: Вам не нужно писать полный неймспейс контроллера, если вы задали его в
URL::setRootControllerNamespace
.
return redirect()->action('App\Http\Controllers\UserController@profile', [1]);
return redirect()->action('App\Http\Controllers\UserController@profile', ['user' => 1]);
The response
helper may be used to conveniently generate other types of response instances. When the response
helper is called without arguments, an implementation of the Illuminate\Contracts\Routing\ResponseFactory
contract is returned. This contract provides several helpful methods for generating responses.
Если хэлпер response()
вызывается без параметров, он возвращает имплементацию контракта Illuminate\Contracts\Routing\ResponseFactory
, которая содержит несколько методов для генерации HTTP-ответа.
Метод json
автоматически устанавливает заголовок Content-Type
в application/json
return response()->json(['name' => 'Steve', 'state' => 'CA']);
return response()->json(['name' => 'Steve', 'state' => 'CA'])
->setCallback($request->input('callback'));
return response()->download($pathToFile);
return response()->download($pathToFile, $name, $headers);
Примечание: Классы Symfony HttpFoundation, которые занимаются функцей отдачи файла, требуют, чтобы имя файла было в ASCII-формате.
Вы можете оформить свой вариант HTTP-ответа в виде макроса, чтобы использовать его в других роутах или контроллерах в короткой форме.
HTTP-макросы определяются в методе boot()
сервис-провайдера:
<?php namespace App\Providers;
use Response;
use Illuminate\Support\ServiceProvider;
class ResponseMacroServiceProvider extends ServiceProvider {
/**
* Perform post-registration booting of services.
*
* @return void
*/
public function boot()
{
Response::macro('caps', function($value)
{
return Response::make(strtoupper($value));
});
}
}
Используется макрос так:
return response()->caps('foo');