HTTP 响应
HTTP 响应
基础响应
所有路由和控制器都会返回一个响应并发送给用户的浏览器。 Lumen 提供了几种不同的方式返回响应。最基本的响应就是从路由或者控制器返回一个字符串:
$router->get('/', function () {
return 'Hello World';
});
框架会自动将返回的字符串转换为一个 HTTP 响应。
响应对象
实际上,大多数时候你希望在路由和控制器方法中返回一个完整的 Illuminate\Http\Response
实例,你可以通过返回一个完整的 Response
实例来自定义返回的状态码和响应头信息。 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
的合约。这个合约提供了一些可以帮助生成响应的方法
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
辅助函数并且不传参数的时候,将返回一个Laravel\Lumen\Http\Redirector
的实例,它允许你调用Redirector
实例上的任何方法。举个例子?,生成一个RedirectResponse
到你定义的名字的路由,可以用 route
方法:
return redirect()->route('login');
如果你的路由有参数,你可以通过第二个参数传递给route
方法:
// 一个如下 URI: profile/{id} 的路由例子
return redirect()->route('profile', ['id' => 1]);
如果你重定向一个路由的时候用 "ID" 这个参数,那么有一种更流行的做法是用Eloquent
模型,你只需传递模型本身。ID 将会被自动提取:
return redirect()->route('profile', [$user]);
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。