🦄 2024 独立开发者训练营,一起创业!查看介绍 / 立即报名(剩余10个优惠名额) →

Laravel 5 中文手册(七):响应 Responses

基本的响应

从路由上返回字符串

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 中文手册

评论

这算是在翻译吗

是啊,Laravel 的官方文档。

有个问题想请教下,看你的列表页http://ninghao.net/blog,你的文章下面都会附加很多文章开头一段,这是怎么做的呢?
我现在是把内容和常用字段分表的,但你这种,难道是直接使用mysql获取content,截取?但截取也没有那么准啊,
很纠结这个问题,能麻烦您帮我解答下吗?谢谢,QQ:28737164,

这个文章的列表是用 Views 模块生成的,在创建这个博客页面的视图里:显示:内容 | 摘要,这样每块文章都会使用文章的摘要,这个摘要会自动生成,你也可以在发布博客文章的时候手工去设置这个摘要。

大概明白您 的意思了,但还有个问题,我mysql在主表中用的简介是char 255,使用的是static表类型,
但看您 这边摘要有时都不只255个字,难道用varchar?这样就破坏结构了啊?

没特别处理,一切都交给 Drupal 。

微信好友

用微信扫描二维码,
加我好友。

微信公众号

用微信扫描二维码,
订阅宁皓网公众号。

240746680

用 QQ 扫描二维码,
加入宁皓网 QQ 群。

统计

15260
分钟
0
你学会了
0%
完成

社会化网络

关于

微信订阅号

扫描微信二维码关注宁皓网,每天进步一点