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
相关产品推荐
相关产品推荐

