HTTP 响应
基本响应
从路由返回字符串
从 Laravel 路由返回的最基本响应是一个字符串:
Route::get('/', function()
{
return 'Hello World';
});创建自定义响应
然而,对于大多数路由和控制器操作,您将返回一个完整的 Illuminate\Http\Response 实例或一个视图。返回完整的 Response 实例允许您自定义响应的 HTTP 状态码和头信息。Response 实例继承自 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);NOTE
有关可用 Response 方法的完整列表,请查看其 API 文档 和 Symfony API 文档。
在响应中发送视图
如果您需要访问 Response 类方法,但希望返回视图作为响应内容,可以使用 view 方法以方便:
return response()->view('hello')->header('Content-Type', $type);将 Cookie 附加到响应
return response($content)->withCookie(cookie('name', 'value'));方法链
请记住,大多数 Response 方法是可链式调用的,允许流畅地构建响应:
return response()->view('hello')->header('Content-Type', $type)
->withCookie(cookie('name', 'value'));重定向
重定向响应通常是 Illuminate\Http\RedirectResponse 类的实例,并包含重定向用户到另一个 URL 所需的正确头信息。
返回重定向
有几种方法可以生成 RedirectResponse 实例。最简单的方法是使用 redirect 辅助方法。在测试时,通常不需要模拟重定向响应的创建,因此使用辅助方法几乎总是可以接受的:
return redirect('user/login');返回带有闪存数据的重定向
重定向到新 URL 并将数据闪存到会话通常同时进行。因此,为了方便,您可以在单个方法链中创建 RedirectResponse 实例并将数据闪存到会话:
return redirect('user/login')->with('message', 'Login Failed');重定向到上一个 URL
您可能希望在表单提交后将用户重定向到他们之前的位置。您可以使用 back 方法来实现:
return redirect()->back();
return redirect()->back()->withInput();返回到命名路由的重定向
当您调用没有参数的 redirect 辅助方法时,将返回一个 Illuminate\Routing\Redirector 实例,允许您调用 Redirector 实例上的任何方法。例如,要生成到命名路由的 RedirectResponse,可以使用 route 方法:
return redirect()->route('login');返回带参数的命名路由的重定向
如果您的路由有参数,可以将它们作为 route 方法的第二个参数传递。
// 对于具有以下 URI 的路由:profile/{id}
return redirect()->route('profile', [1]);如果您正在重定向到一个带有“ID”参数的路由,该参数是从 Eloquent 模型中提取的,您可以简单地传递模型本身。ID 将自动提取:
return redirect()->route('profile', [$user]);使用命名参数返回到命名路由的重定向
// 对于具有以下 URI 的路由:profile/{user}
return redirect()->route('profile', ['user' => 1]);返回到控制器动作的重定向
类似于生成到命名路由的 RedirectResponse 实例,您也可以生成到控制器动作的重定向:
return redirect()->action('App\Http\Controllers\HomeController@index');NOTE
如果您通过 URL::setRootControllerNamespace 注册了根控制器命名空间,则不需要指定控制器的完整命名空间。
返回带参数的控制器动作的重定向
return redirect()->action('App\Http\Controllers\UserController@profile', [1]);使用命名参数返回到控制器动作的重定向
return redirect()->action('App\Http\Controllers\UserController@profile', ['user' => 1]);其他响应
response 辅助函数可用于方便地生成其他类型的响应实例。当不带参数调用 response 辅助函数时,将返回 Illuminate\Contracts\Routing\ResponseFactory 契约的实现。此契约提供了几个有用的方法来生成响应。
创建 JSON 响应
json 方法将自动将 Content-Type 头设置为 application/json:
return response()->json(['name' => 'Abigail', 'state' => 'CA']);创建 JSONP 响应
return response()->json(['name' => 'Abigail', 'state' => 'CA'])
->setCallback($request->input('callback'));创建文件下载响应
return response()->download($pathToFile);
return response()->download($pathToFile, $name, $headers);
return response()->download($pathToFile)->deleteFileAfterSend(true);NOTE
管理文件下载的 Symfony HttpFoundation 要求下载的文件具有 ASCII 文件名。
响应宏
如果您希望定义一个可以在各种路由和控制器中重用的自定义响应,可以在 Illuminate\Contracts\Routing\ResponseFactory 的实现上使用 macro 方法。
例如,从服务提供者的 boot 方法中:
<?php namespace App\Providers;
use Response;
use Illuminate\Support\ServiceProvider;
class ResponseMacroServiceProvider extends ServiceProvider {
/**
* 执行服务的注册后引导。
*
* @return void
*/
public function boot()
{
Response::macro('caps', function($value)
{
return Response::make(strtoupper($value));
});
}
}macro 函数接受一个名称作为其第一个参数,一个闭包作为其第二个参数。当从 ResponseFactory 实现或 response 辅助函数调用宏名称时,将执行宏的闭包:
return response()->caps('foo');