Laravel 会话数据在页面加载时不会粘连

问题描述 投票:0回答:6

我尝试运行以下代码:

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

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

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

如果我重新运行同一页面,但注释掉

Session::put('progress', '5%');
,以便仅调用
dd()
行,我会得到一个空值,而不是存储在上一个页面加载中的 5% 值。

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

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

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

php session laravel laravel-4
6个回答
65
投票

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

当 Laravel 应用程序生命周期开始时,

put
中的任何值
Session
都不会被存储,直到应用程序生命周期结束。也就是说,
put
中的任何值
Session
最终/真的会是
stored

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

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

48
投票
Rubens Mariuzzo 的

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

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

1
投票
我移动了会话中间件

\Illuminate\Session\Middleware\StartSession::class

到属性$middleware中

应用程序/Http/Kernel.php

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

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


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

dd(Session::all());

不返回任何内容,但是:

print_r(Session::all());

返回所有会话数据!


0
投票
在我的例子中,我在一个请求中刷新了变量,然后将其放入另一个请求(具有相同名称)的会话中。

不幸的是,终止方法遍历了所有先前刷新的属性并清除了我新创建的会话属性(它在之前的请求中被刷新,因此 laravel 认为不再需要它并且无法判断它是新创建的)。我想出了调试

Kernel->terminateMiddleware

的方法。您可以在终止方法中放置断点。在某个阶段它会达到
Store->ageFlashData
。这是负责删除我的财产的方法。


0
投票
我的应用程序通常会存储会话变量,但有时(约 5% 的时间)不会。 我尝试了多种方法,但是,这是唯一可靠工作的方法(到目前为止):

$request->session()->put('key', 'value'); $request->session()->save();
干杯:)

© www.soinside.com 2019 - 2024. All rights reserved.