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);
有关可用 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');
如果您通过 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);
管理文件下载的 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');