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

Laravel 8.75中View::share共享数据无法在404错误页生效

问题原因

Laravel 8请求生命周期中,404、500等HTTP错误页面由异常处理器直接渲染,不会经过控制器层中间件管道:路由匹配失败抛出404异常时,不会实例化基础控制器,写在控制器构造函数里的闭包中间件完全不执行,无法向错误页共享变量。
另外直接在服务提供者启动阶段调用View::share()也会失效:服务提供者启动时请求还未经过会话、认证中间件处理,此时无法获取登录用户ID和会话ID,不能正确初始化购物车数据。

解决方案

采用视图Composer实现全局变量注入,该方式会在所有视图(包括异常处理器渲染的错误页)渲染前执行回调,此时会话、认证逻辑已经完成初始化,可以正确获取所需数据。

  • 第一步:移除原有基础Controller构造函数中编写的闭包中间件逻辑
  • 第二步:在app/Providers/AppServiceProvider.php的boot方法中添加全局视图绑定逻辑,代码如下:
<?php

namespace App\Providers;

use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        //
    }

    public function boot()
    {
        // 绑定所有视图的共享数据回调
        view()->composer('*', function ($view) {
            $userId = Auth::check() ? Auth::id() : Session::getId();
            \Cart::session($userId);
            
            $view->with([
                'cart' => \Cart::getContent(),
                'total' => \Cart::getTotal()
            ]);
        });
    }
}
  • 第三步:(必要配置)如果404页面仍然无法正常获取会话数据,调整app/Http/Kernel.php的全局中间件配置,把会话启动相关中间件加入全局中间件列表,确保异常请求也能正常启动会话:
protected $middleware = [
    // 原有全局中间件,例如TrustProxies、HandleCors等
    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\View\Middleware\ShareErrorsFromSession::class,
];

配置完成后执行php artisan view:clear、php artisan route:clear清空缓存即可生效,所有页面包括404等错误页都能正常获取cart和total变量。


内容的提问来源于stack exchange,提问作者Steve

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 23:36:08