基本的响应
从路由上返回字符串
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 的文档 。
在响应里发送一个视图
如果你需要访问 Reponse 类的方法,但是想把一个视图作为返回的响应的内容,你可以使用 view 方法:
return response()->view('hello')->header('Content-Type', $type);
在响应上附加 Cookies
return response($content)->withCookie(cookie('name', 'value'));
方法链
大部分 Response 方法都可链的,可以让你流畅的去创建响应:
return response()->view('hello')->header('Content-Type', $type) ->withCookie(cookie('name', 'value'));
重定向
重定向的响应一般就是 Illuminate\Http\RedirectResponse 类的一个实例,里面会包含合适的头部信息把用户重定向到另一个地址上。
返回一个重定向
有几种方法可以去生成一个 RedirectResponse 实例。最简单的方法就是用 redirect 这个帮手方法。当测试的时候,一般不会 去 mock 创建的重定向响应,所以使用帮手方法在大部分情况下都是可以接受的:
return redirect('user/login');
返回带闪存数据的重定向
一般我们经常会把一些数据闪存到会话里,同时去重定向到一个新的地址上。我们可以用一个方法链去创建一个 RedirectResponse 实例并且把数据闪存到会话里:
return redirect('user/login')->with('message', '登录失败了!');
重定向到前一个地址上
你可以想要去把用户重定向到他们上一次访问的地址上,比如,在提交表单以后。可以使用 back 这个方法:
return redirect()->back(); return redirect()->back()->withInput();
返回一个到有名字的路由的重定向
不带参数去调用 redirect 帮手的时候,会返回一个 Illuminate\Routing\Redirector 的实例,可以让你调用所有的在 Redirector 实例上的方法。比如,去生成一个到有名字的路由的 RedirectResponse ,你可以使用 route 方法:
返回一个到有名字带参数的路由的重定向
如果你的路由有参数,你可以把它们放到 route 方法的第二个参数上。
// 路由的地址像这样:profile/{id}
return redirect()->route('profile', [1]);
如果你要重定向带一个 “ID” 参数的路由,这个 “ID” 来自 Eloquent 模型,你可以简单的把这个模型本身传递进来,这个 “ID” 会自动被分离出来:
return redirect()->route('profile', [$user]);
使用命名的参数返回一个到有名字的路由的重定向
// 路由的地址像这样: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]);
其它的响应
响应帮手可以用来生成其它类型的响应实例。调用响应帮手的时候,如果不指定参数,会返回一个实施了的 Illuminate\Contracts\Routing\ResponseFactory Contract。这个 Contract 为生成响应提供了一些有用的方法。
创建 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);
注意:管理文件下载的 Symfony HttpFoundation,需要被下载的文件使用 ASCII 类型的文件名。
响应宏
如果你想去自定义可以在路由跟控制器上重复使用的响应,可以使用在实施了的 Illuminate\Contracts\Routing\ResponseFactory 上的 macro 方法。
例如,一个来自 Service Provider 的 boot 方法:
<?php namespace App\Providers;
use Response;
use Illuminate\Support\ServiceProvider;
class ResponseMacroServiceProvider extends ServiceProvider {
/**
* Perform post-registration booting of services.
*
* @return void
*/
public function boot()
{
Response::macro('caps', function($value)
{
return Response::make(strtoupper($value));
});
}
}
macro 函数的第一个参数是 name,第二个参数是一个 Closure。在 ResponseFactory 实施或者 response 帮手上调用宏的名字会去执行宏的 Closure 。
return response()->caps('foo');Laravel Laravel5 中文手册
评论
这算是在翻译吗
9 年 9 个月 以前
是啊,Laravel 的官方文档。
9 年 9 个月 以前
有个问题想请教下,看你的列表页http://ninghao.net/blog,你的文章下面都会附加很多文章开头一段,这是怎么做的呢?
我现在是把内容和常用字段分表的,但你这种,难道是直接使用mysql获取content,截取?但截取也没有那么准啊,
很纠结这个问题,能麻烦您帮我解答下吗?谢谢,QQ:28737164,
9 年 9 个月 以前
这个文章的列表是用 Views 模块生成的,在创建这个博客页面的视图里:显示:内容 | 摘要,这样每块文章都会使用文章的摘要,这个摘要会自动生成,你也可以在发布博客文章的时候手工去设置这个摘要。
9 年 9 个月 以前
大概明白您 的意思了,但还有个问题,我mysql在主表中用的简介是char 255,使用的是static表类型,
但看您 这边摘要有时都不只255个字,难道用varchar?这样就破坏结构了啊?
9 年 9 个月 以前
没特别处理,一切都交给 Drupal 。
9 年 9 个月 以前