Laravel 5.6构造函数中无法获取Session问题求助
解决Laravel构造函数中无法获取Session数据的问题
这个问题我之前也碰到过,根源在于Laravel的请求生命周期顺序:控制器的构造函数会在**session中间件(StartSession)**执行前就运行了,这时候session还没被加载,所以你调用session('cart')会返回null。
下面给你两种可行的解决方案:
方案1:通过中间件闭包初始化属性
在控制器构造函数中使用$this->middleware()注册一个闭包中间件,这个闭包会在session加载完成后执行,这样就能正常获取和操作session数据了:
public function __construct() { $this->middleware(function ($request, $next) { // 现在可以正常获取session数据了 $this->cart = session('cart'); $this->payment = session('payment'); $this->coupon = session('coupon'); $this->currency = \App\Setting::where('key','eur_currency')->first()->value; if (!isset($this->cart["items"])) { $cart = ['items' => [],'total' => 0, 'sub_total' => 0,'try' => 0]; session(['cart' => $cart]); $this->cart = session('cart'); } // 继续处理请求 return $next($request); }); }
方案2:将Session逻辑移到控制器方法中
如果不想用中间件,也可以把session相关的初始化逻辑抽成一个单独的方法,然后在需要的控制器方法(比如index、checkout等)中调用:
public function __construct() { // 构造函数中不处理session相关逻辑 } /** * 初始化Session中的购物车等数据 */ protected function initSessionData() { $this->cart = session('cart'); $this->payment = session('payment'); $this->coupon = session('coupon'); $this->currency = \App\Setting::where('key','eur_currency')->first()->value; if (!isset($this->cart["items"])) { $cart = ['items' => [],'total' => 0, 'sub_total' => 0,'try' => 0]; session(['cart' => $cart]); $this->cart = session('cart'); } } // 在具体的控制器方法中调用初始化逻辑 public function checkout() { $this->initSessionData(); // 后续的结账逻辑 }
补充说明
Laravel的请求流程是这样的:
- 接收请求
- 实例化控制器(执行构造函数)
- 运行路由中间件(包括StartSession中间件,负责加载session)
- 执行控制器的方法
所以构造函数执行时,session还没被StartSession中间件加载,自然拿不到数据。上面的两种方案都是让session相关逻辑在StartSession之后执行,就能解决问题了。
内容的提问来源于stack exchange,提问作者Rıza Sabuncu
相关产品推荐
相关产品推荐

