Skip to content

HTTP 响应

基本响应

从路由返回字符串

从 Laravel 路由返回的最基本响应是一个字符串:

php
Route::get('/', function()
{
	return 'Hello World';
});

创建自定义响应

然而,对于大多数路由和控制器操作,您将返回一个完整的 Illuminate\Http\Response 实例或一个视图。返回完整的 Response 实例允许您自定义响应的 HTTP 状态码和头信息。Response 实例继承自 Symfony\Component\HttpFoundation\Response 类,提供了多种方法来构建 HTTP 响应:

php
use Illuminate\Http\Response;

return (new Response($content, $status))
              ->header('Content-Type', $value);

为了方便,您也可以使用 response 辅助函数:

php
return response($content, $status)
              ->header('Content-Type', $value);
lightbulb

有关可用 Response 方法的完整列表,请查看其 API 文档Symfony API 文档

在响应中发送视图

如果您需要访问 Response 类方法,但希望返回视图作为响应内容,可以使用 view 方法以方便:

php
return response()->view('hello')->header('Content-Type', $type);
php
return response($content)->withCookie(cookie('name', 'value'));

方法链

请记住,大多数 Response 方法是可链式调用的,允许流畅地构建响应:

php
return response()->view('hello')->header('Content-Type', $type)
                 ->withCookie(cookie('name', 'value'));

重定向

重定向响应通常是 Illuminate\Http\RedirectResponse 类的实例,并包含重定向用户到另一个 URL 所需的正确头信息。

返回重定向

有几种方法可以生成 RedirectResponse 实例。最简单的方法是使用 redirect 辅助方法。在测试时,通常不需要模拟重定向响应的创建,因此使用辅助方法几乎总是可以接受的:

php
return redirect('user/login');

返回带有闪存数据的重定向

重定向到新 URL 并将数据闪存到会话通常同时进行。因此,为了方便,您可以在单个方法链中创建 RedirectResponse 实例将数据闪存到会话:

php
return redirect('user/login')->with('message', 'Login Failed');

重定向到上一个 URL

您可能希望在表单提交后将用户重定向到他们之前的位置。您可以使用 back 方法来实现:

php
return redirect()->back();

return redirect()->back()->withInput();

返回到命名路由的重定向

当您调用没有参数的 redirect 辅助方法时,将返回一个 Illuminate\Routing\Redirector 实例,允许您调用 Redirector 实例上的任何方法。例如,要生成到命名路由的 RedirectResponse,可以使用 route 方法:

php
return redirect()->route('login');

返回带参数的命名路由的重定向

如果您的路由有参数,可以将它们作为 route 方法的第二个参数传递。

php
// 对于具有以下 URI 的路由:profile/{id}

return redirect()->route('profile', [1]);

如果您正在重定向到一个带有“ID”参数的路由,该参数是从 Eloquent 模型中提取的,您可以简单地传递模型本身。ID 将自动提取:

php
return redirect()->route('profile', [$user]);

使用命名参数返回到命名路由的重定向

php
// 对于具有以下 URI 的路由:profile/{user}

return redirect()->route('profile', ['user' => 1]);

返回到控制器动作的重定向

类似于生成到命名路由的 RedirectResponse 实例,您也可以生成到控制器动作的重定向:

php
return redirect()->action('App\Http\Controllers\HomeController@index');
lightbulb

如果您通过 URL::setRootControllerNamespace 注册了根控制器命名空间,则不需要指定控制器的完整命名空间。

返回带参数的控制器动作的重定向

php
return redirect()->action('App\Http\Controllers\UserController@profile', [1]);

使用命名参数返回到控制器动作的重定向

php
return redirect()->action('App\Http\Controllers\UserController@profile', ['user' => 1]);

其他响应

response 辅助函数可用于方便地生成其他类型的响应实例。当不带参数调用 response 辅助函数时,将返回 Illuminate\Contracts\Routing\ResponseFactory 契约的实现。此契约提供了几个有用的方法来生成响应。

创建 JSON 响应

json 方法将自动将 Content-Type 头设置为 application/json

php
return response()->json(['name' => 'Abigail', 'state' => 'CA']);

创建 JSONP 响应

php
return response()->json(['name' => 'Abigail', 'state' => 'CA'])
                 ->setCallback($request->input('callback'));

创建文件下载响应

php
return response()->download($pathToFile);

return response()->download($pathToFile, $name, $headers);

return response()->download($pathToFile)->deleteFileAfterSend(true);
lightbulb

管理文件下载的 Symfony HttpFoundation 要求下载的文件具有 ASCII 文件名。

响应宏

如果您希望定义一个可以在各种路由和控制器中重用的自定义响应,可以在 Illuminate\Contracts\Routing\ResponseFactory 的实现上使用 macro 方法。

例如,从服务提供者boot 方法中:

php
<?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 辅助函数调用宏名称时,将执行宏的闭包:

php
return response()->caps('foo');