Laravel 会话数据不会在页面加载过程中滞留

2022-08-30 15:24:53

我尝试运行以下代码:

Session::put('progress', '5%');

dd(Session::get('progress'));

这将在转储中显示“5%”。

如果我重新运行同一页面,但注释掉以便仅调用该行,则我将获得空值,而不是上一个页面加载中存储的5%值。Session::put('progress', '5%');dd()

这是我的会话配置,所以我知道它应该存储数据:

'driver' => 'native',
'lifetime' => 120,
'expire_on_close' => false,

为什么Laravel不跨页面加载存储会话数据?


答案 1

问题在于,由于您在 Laravel 完成其应用程序生命周期之前终止了脚本,因此放入会话(但尚未存储)的值也被终止了。

当 Laravel 应用程序生命周期开始时,在应用程序生命周期结束之前,不会存储 中的任何值。那时,中的任何值都将最终/真正。putSessionputSessionstored

如果您检查源,您会发现相同的上述行为:

 public function put($key, $value)
 {
     $all = $this->all();

     array_set($all, $key, $value);

     $this->replace($all);
 }

如果要对其进行测试,请执行以下操作:

  1. 在会话中存储值而不终止脚本。

    Route::get('test', function() {
        Session::put('progress', '5%');
        // dd(Session::get('progress'));
    });
    
  2. 检索已存储的值:

    Route::get('test', function() {
        // Session::put('progress', '5%');
        dd(Session::get('progress'));
    });
    

答案 2

Rubens Mariuzzo的回答非常好。我只想补充一点,如果您需要立即存储数据,则可以使用save方法:

Session::put('progress', '5%');
Session::save();

推荐