HTTP 响应
基本响应
当然,所有的路由及控制器必须返回某个类型的响应,并发送回用户的浏览器。Laravel 提供了几种不同的方法来返回响应。最基本的响应就是从路由或控制器简单的返回一个字符串:
$router->get('/', function () {
return 'Hello World';
});
指定的字符串会被框架自动转换成 HTTP 响应。
响应对象
但是,对于大多数路由和控制器行为操作,你将返回完整的 Illuminate\Http\Response
实例。 返回完整的 Response
实例允许你自定义响应的 HTTP 状态码和标题。 一个 Response
实例继承自 Symfony\Component\HttpFoundation\Response
类,并且提供了多种构建 HTTP 响应的方法:
use Illuminate\Http\Response;
$router->get('home', function () {
return (new Response($content, $status))
->header('Content-Type', $value);
});
为了方便起见,你可以使用 response
辅助函数:
$router->get('home', function () {
return response($content, $status)
->header('Content-Type', $value);
});
注意: 有关
Response
方法的完整列表可以参照 API 文档 以及 Symfony API 文档。
附加标头至响应
大部份的响应方法是可链式调用的,这让你可以顺畅的创建响应。举例来说,你可以在响应发送给用户之前,使用 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',
]);
其它响应类型
使用辅助函数 response
可以轻松的生成其它类型的响应实例。当你调用辅助函数 response
且不带任何参数时,将会返回 Illuminate\Contracts\Routing\ResponseFactory
contract 的实现。此 Contract 提供了一些有用的方法来生成响应。
JSON 响应
json
方法会自动将标头的 Content-Type
设置为 application/json
,并通过 PHP 的 json_encode
函数将指定的数组转换为 JSON:
return response()->json(['name' => 'Abigail', 'state' => 'CA']);
你可以选择提供一个状态码和一个额外的标题数组:
return response()->json(['error' => 'Unauthorized'], 401, ['X-Header-One' => 'Header Value']);
如果你想创建一个 JSONP 响应,则可以使用 json
方法并加上 setCallback
方法:
return response()
->json(['name' => 'Abigail', 'state' => 'CA'])
->setCallback($request->input('callback'));
文件下载
download
方法可以用于生成强制让用户的浏览器下载指定路径文件的响应。download
方法接受文件名称作为方法的第二个参数,此名称为用户下载文件时看见的文件名称。最后,你可以传递一个 HTTP 标头的数组作为第三个参数传入该方法:
return response()->download($pathToFile);
return response()->download($pathToFile, $name, $headers);
注意: 管理文件下载的扩展包 Symfony HttpFoundation,要求下载文件必须是 ASCII 文件名。
重定向
重定向响应是类 Illuminate\Http\RedirectResponse
的实例,并且包含用户要重定向至另一个 URL 所需的标头。有几种方法可以生成 RedirectResponse
的实例。最简单的方式就是通过全局的 redirect
辅助函数:
$router->get('dashboard', function () {
return redirect('home/dashboard');
});
重定向至命名路由
当你调用 redirect
辅助函数且不带任何参数时,将会返回 Illuminate\Routing\Redirector
的实例,你可以对该 Redirector
的实例调用任何方法。举个例子,要生成一个 RedirectResponse
到一个命名路由,你可以使用 route
方法:
return redirect()->route('login');
如果你的路由有参数,则可以将参数放进 route
方法的第二个参数:
// 重定向到以下 URI: profile/{id}
return redirect()->route('profile', ['id' => 1]);
如果你要重定向至路由且路由的参数为 Eloquent 模型的「ID」,则可以直接将模型传入,ID 将会自动被提取:
return redirect()->route('profile', [$user]);