Laravel会话数据不会跨越页面加载

时间:2014-05-28 16:45:12

标签: php session laravel laravel-4

我尝试运行以下代码:

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

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

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

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

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

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

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

5 个答案:

答案 0 :(得分:41)

问题是因为你在Laravel完成其应用程序生命周期之前杀死了脚本,所以放入会话(但尚未存储)的值也被杀死了。

当Laravel应用程序生命周期开始时,put中的任何值Session在应用程序生命周期结束之前尚未存储。即,put中的任何值Session最终/真正stored

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

 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'));
    });
    

答案 1 :(得分:23)

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

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

答案 2 :(得分:0)

对我来说,即使数据已正确存储到会话之后:

    dd(Session::all());

什么都不返回,但是:

    print_r(Session::all());

返回所有会话数据!

答案 3 :(得分:0)

在我的情况下,我在一个请求中刷新变量,然后在另一个请求(具有相同名称)中将其放入会话中。

不幸的是,终止方法经历了所有先前闪存的属性并清理了我新创建的会话属性(它在之前的请求中被刷新,因此laravel认为它不再需要并且无法告诉它是新创建的)。我想出了调试Kernel->terminateMiddleware方法。您可以在终止方法中放置断点。在某个阶段它达到Store->ageFlashData。这是负责删除我的财产的方法。

答案 4 :(得分:0)

我移动了会话中间件

<块引用>

\Illuminate\Session\Middleware\StartSession::class

到属性 $middleware

<块引用>

app/Http/Kernel.php

在这种情况下,您需要将其从网络组 ($middlewareGroups) 中删除

enter image description here

对我有帮助,希望对你也有帮助