Menu

Laravel 响应:永远返回 JSON 响应

当你在编写完全为 API 服务的 Laravel 应用时,你希望所有响应都是 JSON 格式的,而不是例如说授权错误会重定向到 /home 或 /login,最终重定向会变成 InvalidArgumentException: Route [login] is not defined. 的视图。

下面这个简单的方案,可以让你的 Laravel 应用优先响应为 JSON 格式。

第一步、编写 BaseRequest

首先我们需要构建一个 BaseRequest 来重写 Illuminate\Http\Request ,修改为默认优先使用 JSON 响应:

app/Http/Requests/BaseRequest.php

<?php
namespace App\Http\Requests;

use Illuminate\Http\Request;
class BaseRequest extends Request
{
    public function expectsJson()
    {
        return true;
    }
    public function wantsJson()
    {
        return true;
    }
}

第二步、替换 BaseRequest

public/index.php 文件中,将 \Illumiate\Http\Request 替换为我们的 BaseRequest,如下:

$response = $kernel->handle(
    $request = \App\Http\Requests\BaseRequest::capture()
);

搞定!

现在所有的响应都是 application/json ,包括错误和异常。

本文为 Wiki 文章,邀您参与纠错、纰漏和优化
讨论数量: 26

我來貢獻一下我自己的做法

新增 middleware

namespace App\Http\Middleware;

use Closure;

class ForceJson
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $request->headers->set('accept', 'application/json');

        return $next($request);
    }
}

Kernel.php 加入

'force-json' => \App\Http\Middleware\ForceJson::class,

routes/api.php

Route::group(['middleware' => ['force-json', 'auth:api']], function () {
    // put your router
});

打完收功

這樣的做法可以任意指定 router 的行為
還可以不用更動到 Laravel 原生的程式碼

6个月前
overtrue

黑科技

7个月前
overtrue

黑科技

7个月前

66666, 又学到了

7个月前

果然黑科技。

7个月前
XiaohuiLam

操作好骚

7个月前

果然是骚操作

7个月前
aen233

黑科技,学到了

7个月前
GhostCoder

666666666

7个月前
GalaxyNo_1

:gem: 黑科技

7个月前

反手就是一个赞

7个月前
sushengbuhuo

666

7个月前

喜欢黑科技,666

6个月前

我來貢獻一下我自己的做法

新增 middleware

namespace App\Http\Middleware;

use Closure;

class ForceJson
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $request->headers->set('accept', 'application/json');

        return $next($request);
    }
}

Kernel.php 加入

'force-json' => \App\Http\Middleware\ForceJson::class,

routes/api.php

Route::group(['middleware' => ['force-json', 'auth:api']], function () {
    // put your router
});

打完收功

這樣的做法可以任意指定 router 的行為
還可以不用更動到 Laravel 原生的程式碼

6个月前
eiomi

厉害

6个月前
largezhou

牛逼啊,省的总是要在headers中加一个xhr....

6个月前

哈哈哈,为什么我想笑啊,哈哈哈哈

6个月前
wujunze

不错

6个月前

黑色武器吧

6个月前
sureyee

这个在请求头中加入Accept:application/json就可以了吧

6个月前
GalaxyNo_1

牛叉

5个月前
Timgle

可以的,666

5个月前
Shuyi

如果这样,不如直接用Lumen。。。

4个月前
wanghan

@recca0120 我觉得你的方法更好

4个月前
黑将军

@recca0120 我也是用这种方法

4个月前

@recca0120 同样是九年义务教育,niTM 怎么这么优秀

4个月前

@recca0120 其实~你的做法好,但这个 accept 的设置应该在前端或请求段,不应该服务器自己手动设置;

3个月前

@Moting 這個是單純的思路,可以快速的解決這個需求,但如你所說的不該我們設置,所以應該再多一行判斷式才對,判斷 request header accept 有無值,有值就不做任何動作,空值就補 header ,這樣就把控制權還給 client 了

5天前

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!