我正在尝试处理 Laravel 11 项目中 Passport 的一些异常,但由于某种原因,我添加到 app.php 文件的
->withExceptions
部分的任何可渲染异常(Passport 和其他异常)都将被忽略。
我正在我的路线调用的方法的开头使用
throw new \Laravel\Passport\Exceptions\MissingScopeException();
进行测试。
我期望工作的代码如下所示(在我的 app.php 的
->withExceptions
部分内):
$exceptions->render(function (\Laravel\Passport\Exceptions\MissingScopeException $e, \Illuminate\Http\Request $request) {
return response()->json([
'success' => false,
'error' => $e->getMessage(),
], 403);
});
但这被忽略了,而是使用异常本身的异常处理。我还尝试使用异常
Symfony\Component\HttpKernel\Exception\NotFoundHttpException
来处理不存在的路由,但这也会被忽略,并且只使用该异常本身的任何处理。我还尝试使用 $exceptions->renderable
而不是 $exceptions->render
,因为 Exceptions 类传递给 ->withExceptions
使得它们看起来像是可以互换的,但这也不起作用。
证明至少
->withExceptions
部分在一定程度上有效的一件事是,它确实有效:
$exceptions->shouldRenderJsonWhen(function (\Illuminate\Http\Request $request) {
return $request->is('api/*');
});
这使得 Passports MissingScopeException 为 API 路由返回 JSON。我还测试过的其他东西是
$exceptions->respond()
。
我使用的特定 Laravel 版本是(如 php artisan --version 返回)
Laravel Framework 11.2.0
。
我错过了什么吗?我对以任何不同的方式处理异常非常陌生,与在一段可能发生异常的代码中使用 try/catch 块一样,所以我可能只是误解了这一点或遗漏了一些明显的东西,但我真的很感激这里的一些帮助.
我自己最近在 Laravel 11 中的异常处理方面苦苦挣扎,我找到了一个使用
$exception->renderable
的解决方案:
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
...
)
->withMiddleware(function (Middleware $middleware) {
//
})
->withExceptions(function (Exceptions $exceptions) {
$exceptions->renderable(function (YouException $e) {
return response()->json([
'message' => 'message to be displayed.'
], 500);
});
})->create();
取自这篇文章 - link - 希望它可能有所帮助。