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'));
Редирект - это объект класса 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]);
Если параметр роута - это 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]);
Если хэлпер 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');