# HTTP 响应
- [基本响应](#basic-responses)
- [附加标头至响应](#attaching-headers-to-responses)
- [其它响应类型](#other-response-types)
- [JSON 响应](#json-responses)
- [文件下载](#file-downloads)
- [重定向](#redirects)
- [重定向至命名路由](#redirecting-named-routes)
## 基本响应
当然,所有的路由及控制器必须返回某个类型的响应,并发送回用户的浏览器。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 文档](http://laravel.com/api/master/Illuminate/Http/Response.html) 以及 [Symfony API 文档](http://api.symfony.com/3.0/Symfony/Component/HttpFoundation/Response.html)。
#### 附加标头至响应
大部份的响应方法是可链式调用的,这让你可以顺畅的创建响应。举例来说,你可以在响应发送给用户之前,使用 `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]);