Laravel+Inertia错误页面无法获取共享的认证用户Props问题
Laravel+Inertia错误页面无法获取共享的认证用户Props问题
我之前也碰到过一模一样的问题!其实核心原因是:异常处理器里直接返回的Inertia响应,没有经过咱们配置的HandleInertiaRequests中间件——正常页面的请求会走web/api中间件栈,这个中间件会自动把你定义的共享Props(比如auth、name这些)注入到Inertia页面里,但异常响应是直接生成的,跳过了这个流程,所以你在error页面拿不到auth.user就很正常了。
给你两个最靠谱的解决方案:
方案一:复用HandleInertiaRequests的共享数据(推荐)
直接在异常处理里调用中间件的share方法,把所有共享Props合并到error页面的参数里,这样不仅auth,你定义的name、quote这些数据也能同步拿到:
修改bootstrap/app.php里的异常处理闭包:
$exceptions->respond(function (Response $response, Throwable $exception, Request $request) { if (app()->environment(['local', 'testing']) && in_array($response->getStatusCode(), [500, 503, 404, 403])) { // 实例化Inertia中间件,获取所有已定义的共享Props $inertiaMiddleware = app(HandleInertiaRequests::class); $sharedProps = $inertiaMiddleware->share($request); return Inertia::render('error', [ 'status' => $response->getStatusCode(), // 合并共享Props到页面参数中 ...$sharedProps, ]) ->toResponse($request) ->setStatusCode($response->getStatusCode()); } elseif ($response->getStatusCode() === 419) { return back()->with([ 'message' => 'The page expired, please try again.', ]); } return $response; });
方案二:手动传入需要的Auth数据
如果你只需要auth.user这一项数据,也可以直接在渲染error页面时手动传入,更轻量化:
$exceptions->respond(function (Response $response, Throwable $exception, Request $request) { if (app()->environment(['local', 'testing']) && in_array($response->getStatusCode(), [500, 503, 404, 403])) { return Inertia::render('error', [ 'status' => $response->getStatusCode(), // 手动传入认证用户数据 'auth' => ['user' => $request->user()], ]) ->toResponse($request) ->setStatusCode($response->getStatusCode()); } elseif ($response->getStatusCode() === 419) { return back()->with([ 'message' => 'The page expired, please try again.', ]); } return $response; });
补充:为什么正常页面能拿到数据?
再给你理清楚逻辑:正常访问dashboard这类页面时,请求会经过web中间件栈,其中的HandleInertiaRequests会自动执行你定义的share方法,把共享Props附加到Inertia响应里;但异常触发时,Laravel会直接进入异常处理流程,绕过了路由的中间件栈,所以这些共享数据不会自动加上,必须手动处理。
修改后你再在error页面执行console.log(auth),应该就能看到正常的用户数据了!
内容来源于stack exchange
相关产品推荐
相关产品推荐

