所有路由和控制器处理完业务逻辑之后都会返回一个发送到用户浏览器的响应,Laravel提供了多种不同的方式来返回响应,最基本的响应就是从路由或控制器返回一个简单的字符串,框架会自动将这个字符串转化为一个完整的HTTP响应:
除了从路由或控制器返回字符串之外,还可以返回数组。框架会自动将数组转化为一个JSON响应:
{tip}你知道还可以从路由或控制器返回Eloquent集合吗?他们也会被自动转化为JSON响应。
通常,我们并不只是从路由动作简单返回字符串和数组,大多数情况下,都会返回一个完整的IlluminateHttpResponse实例或视图。
返回完整的Response实例允许你自定义响应的HTTP状态码和响应头信息。Response实例继承自SymfonyComponentHttpFoundationResponse类,该类提供了各种构建HTTP响应的方法:
大部分的响应方法都是可链式调用的,使得创建响应实例的过程更具可读性。例如,你可以在响应返回给用户前使用header方法为其添加一系列的头信息:
你可以使用响应上的cookie方法轻松地将为响应增加Cookies。例如,你可以像这样使用cookie方法生成一个cookie并轻松地将其附加到响应上:
cookie方法还接受一些不太频繁使用的参数。通常,这些参数与原生PHP的setcookie方法的参数有着相同的目的和含义:
或者,你可以使用Cookiefacade「队列」,Cookie以附加到应用程序的传出响应。queue方法接受一个Cookie实例或创建Cookie实例所需的参数。这些cookie在发送到浏览器之前会附加到传出响应中:
默认情况下,Laravel生成的所有Cookie都是经过加密和签名,因此不能被客户端修改或读取。如果你想要应用程序生成的部分Cookie不被加密,那么可以使用在app/Http/Middleware目录中AppHttpMiddlewareEncryptCookies中间件的$except属性:
重定向响应是IlluminateHttpRedirectResponse类的实例,并且包含用户需要重定向至另一个URL所需的头信息。Laravel提供了几种方法用于生成RedirectResponse实例。其中最简单的方法是使用全局辅助函数redirect:
有时候你可能希望将用户重定向到之前的位置,比如提交的表单无效时。这时你可以使用全局辅助函数back来执行此操作。由于这个功能利用了会话控制,请确保调用back函数的路由使用web中间件组或所有Session中间件:
如果调用不带参数的辅助函数redirect时,会返回IlluminateRoutingRedirector实例。这个实例允许你调用Redirector上的任何方法。例如为命名路由生成RedirectResponse,可以使用route方法:
如果你要重定向到使用从Eloquent模型填充「ID」参数的路由,可以简单地传递模型本身。ID会被自动提取:
如果你想要自定义这个路由参数中的默认参数名,需要重写模型实例上的getRouteKey方法:
还可以生成到controlleraction的重定向。要达到这个目的,只要把控制器和action的名称传递给action方法。记住,不需要传递控制器的全部命名空间,Laravel的RouteServiceProvider会自动将其设置为基本控制器的命名空间:
有时候你需要重定向到应用外的域名。调用away方法可以达到此目的,它会创建一个不带有任何额外的URL编码、有效性校验和检查的RedirectResponse实例:
重定向到新的URL的同时传送数据给session是很常见的。通常会在成功执行一个动作并传送消息给session之后这样做。为了方便起见,你可以创建一个RedirectResponse实例并在链式方法调用中将数据传送给session:
response助手可以用于生成其它类型的响应实例。当还带参数调用response助手时,返回IlluminateContractsRoutingResponseFactorycontract的一个实现。这个契约提供了几个用于生成响应的方法:
json自动将Content-Type头信息设置为application/json,同时使用PHP的json_encode函数将给定的数组转换为JSON:
download方法可以用于生成强制用户浏览器下载给定路径文件的响应。download方法文件名作为其第二个参数,它将作为用户下载文件的文件名。最后,你可以传递HTTP头信息数组作为其第三个参数:
{注意}用于管理文件下载的SymfonyHttpFoundation要求下载的文件有一个ASCII文件名。
有时,你可能希望将给定操作的字符串响应转换为下载响应,而不需要将其写入磁盘。此时可以使用streamDownload方法。这个方法接受回调、文件名和可选的头信息数组作为参数:
file方法用于直接在用户浏览器显示一个图片或PDF之类的文件,而不是下载。这个方法接受文件路径作为第一个参数,头信息数组作为第二个参数:
如果你想要定义一个自定义的可以在多个路由和控制器中复用的响应,可以使用Response门面上的macro方法。例如,在某个服务提供者的boot方法编写如下代码:
macro方法接受一个名称作为第一个参数,闭包函数作为的第二个参数。响应宏的闭包在ResponseFactory实现类或辅助函数response中调用宏名称的时候被执行: