Laravel5.7环境下Debugbar视图显示0 templates were rendered问题
运行环境
- PHP 版本:7.4.29
- Laravel 版本:5.7.29
- 应用状态:未完成版本升级的存量旧应用
- 故障表现:Laravel Debugbar 首次页面加载可正常展示,点击任意链接、切换标签页、触发交互按钮时,Debugbar 会短暂闪现当前请求的视图模板记录,随即视图区域清空,固定提示
0 templates were rendered,故障可稳定复现。
根因说明
该故障是半升级状态Laravel 5.7项目的典型兼容问题:
- 升级过程中遗留的冗余中间件会在请求生命周期的terminate阶段提前重置视图工厂实例,清空Debugbar已经收集到的视图渲染记录
- Debugbar默认的视图收集器绑定优先级低于业务服务提供者,会被自定义View类绑定覆盖,导致跳转、AJAX请求的视图事件监听失效
- 默认使用session存储Debugbar数据时,半升级项目的session写入顺序冲突会导致新请求数据覆盖已收集完成的视图记录
修复步骤
按以下顺序操作即可解决问题:
- 强制重写视图收集器绑定
打开app/Providers/AppServiceProvider.php,在register()方法最开头加入以下代码,确保Debugbar视图收集器在所有服务之前注册,不被业务服务覆盖:
if (env('APP_DEBUG') && class_exists(\Barryvdh\Debugbar\ServiceProvider::class)) { $this->app->singleton(\Barryvdh\Debugbar\DataCollector\ViewCollector::class, function ($app) { return new \Barryvdh\Debugbar\DataCollector\ViewCollector($app['view'], true); }); }
- 调整中间件顺序,清理冗余中间件
打开app/Http/Kernel.php,找到$middlewareGroups['web']数组:
- 将
\Barryvdh\Debugbar\Middleware\InjectDebugbar::class挪到数组最后一位,保证它在所有视图渲染、业务逻辑执行完成后再注入和收集数据 - 排查数组中所有非Laravel 5.7官方的视图相关自定义中间件,尤其是包含
view()->reset()、$app->instance('view', ...)这类重置视图实例逻辑的旧版本遗留中间件,直接移除即可。
- 修改Debugbar配置
如果还没发布Debugbar配置文件,先执行命令生成配置:php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider"
打开config/debugbar.php修改以下配置项:
'collectors' => [ // 确认视图收集器开启 'views' => true, 'ajax' => [ // 关闭AJAX请求的调试数据栈延迟加载 'use_stack' => false, ], ], // 调试数据存储改为文件存储,避免session写入顺序冲突导致数据覆盖 'storage' => [ 'enabled' => true, 'driver' => 'file', 'path' => storage_path('debugbar'), 'connection' => null, 'provider' => '', ],
- 清除所有运行时缓存
依次执行以下命令清除缓存:
php artisan config:clear php artisan view:clear php artisan cache:clear php artisan route:clear
本地调试环境不要执行
config:cache、route:cache这类缓存生成命令,静态缓存会导致Debugbar的动态配置失效。
修复完成后刷新页面操作任意交互元素,视图收集区会稳定展示所有渲染的模板文件,不会再出现0 templates were rendered的提示。
内容的提问来源于stack exchange,提问作者Krzysztof F.
相关产品推荐
相关产品推荐

