You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 14:19:34