始终在 Laravel 中将 API 异常渲染为 JSON
你是否曾经使用如下自定义中间件强制让异常的 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。
此提示直接来自官方文档,其中还包含一些关于限制异常、自定义错误响应等的优秀提示!