编程

始终在 Laravel 中将 API 异常渲染为 JSON

459 2024-10-28 02:31:00

你是否曾经使用如下自定义中间件强制让异常的 API 请求返回 JSON:

class ForceJsonResponse
{
    public function handle(Request $request, Closure $next)
    {
        $request->headers->set('Accept', 'application/json');
 
        return $next($request);
    }
}

Laravel 11 为你提供了一种方便的方法,无需任何额外的中间件即可完成此操作。如果你使用 web 浏览器测试 API 路由,即使不将 Accept header 设置为 application/json 或使用上述中间件,也将并始终返回 JSON 格式:

// bootstrap/app.php
 
return Application::configure(basePath: dirname(__DIR__))
 
    //...
 
    ->withExceptions(function (Exceptions $exceptions) {
        $exceptions->shouldRenderJsonWhen(function (Request $request, Throwable $e) {
            if ($request->is('api/*')) {
                return true;
            }
 
            return $request->expectsJson();
        });
    })->create();

使用 shouldRenderJsonWhen() 方法,这个代码确保在 API 请求期间抛出的任何异常都被渲染为 JSON。除了异常,你还可以确保无错误响应返回 JSON。

此提示直接来自官方文档,其中还包含一些关于限制异常、自定义错误响应等的优秀提示!