Laravel 9如何在所有页面加载前全局设置sessionStorage变量
关于在Laravel中实现全路由前置Session赋值的方案说明
- 不推荐在
index.php入口文件编写该逻辑:该文件是框架启动的核心入口,后续框架版本升级、执行composer更新依赖时都可能被覆盖,写入的自定义逻辑会直接丢失。且入口文件加载阶段框架的Session服务、路由服务尚未完成初始化,此时调用Session相关方法会直接抛出异常,根本无法实现预期效果。 - 你之前写入基础Controller的方案存在覆盖漏洞:项目中如果存在路由闭包直出、不走控制器的特殊路由,这段逻辑就不会触发,无法覆盖站点内所有路由。
标准最优实现方案
Laravel框架原生提供了全局中间件机制,专门用来处理所有请求都需要执行的前置/后置逻辑,是实现该需求的最规范方案,实现步骤如下:
- 执行Artisan命令生成自定义中间件:
php artisan make:middleware SetEnvironmentSession - 编辑生成的中间件文件,路径为
app/Http/Middleware/SetEnvironmentSession.php,在handle方法中写入前置执行逻辑:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\Session; class SetEnvironmentSession { public function handle(Request $request, Closure $next) { // 前置逻辑:请求到达路由/控制器前执行 if (!Session::has('environment')) { Session::put('environment', env('APP_ENV')); } return $next($request); } }
- 注册为全局中间件:打开
app/Http/Kernel.php文件,找到$middleware全局中间件数组,将自定义中间件追加到StartSession中间件之后即可——只有Session服务启动后才能正常操作Session存储,顺序错误会导致运行报错。参考注册示例:
protected $middleware = [ // 框架自带全局中间件 \Illuminate\Session\Middleware\StartSession::class, // 其他自带中间件... // 追加自定义中间件 \App\Http\Middleware\SetEnvironmentSession::class, ];
该方案的优势:
- 所有经过框架的请求都会触发这段逻辑,无论路由是绑定控制器还是闭包,能100%覆盖站点所有路由
- 逻辑独立存放在自定义中间件文件中,不会随框架升级、依赖更新被覆盖,维护成本极低
- 符合Laravel框架的设计规范,后续维护的开发者可以快速定位到逻辑位置,不会出现隐式逻辑难以排查的问题
内容的提问来源于stack exchange,提问作者Roman
相关产品推荐
相关产品推荐

