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

Posted

技术标签:

【中文标题】Laravel 会话数据不会跨页面加载【英文标题】:Laravel session data not sticking across page loads 【发布时间】:2014-07-18 00:26:34 【问题描述】:

我尝试运行以下代码:

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

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

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

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

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

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

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

【问题讨论】:

我相信这是因为您在 Laravel 完成其生命周期之前使用 dd() 杀死脚本,该值未存储到会话中。尝试输入一个不带 dd 的值来完成整个 Laravel 生命周期。然后,在那之后,尝试检索它。 【参考方案1】:

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

当 Laravel 应用程序生命周期开始时,Session 中的任何值 put 都不会存储,直到应用程序生命周期结束。那就是Session 中的任何值put 最终/实际上将是stored

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

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

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

     $this->replace($all);
 

如果要测试它,请执行以下操作:

    在会话中存储一个值而不杀死脚本。

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

    检索已经存储的值

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

【讨论】:

非常好!感谢您不仅提供解决方案,还感谢管道的详细解释。 :) 我可以强制 Laravel 立即写入会话数据吗?我正在尝试使用它来存储通过 AJAX 访问的进程的进度。 laravel session 在哪里存储值?我在会话存储中看不到它们。 在全新安装中,会话存储驱动程序是磁盘文件。 非常好的伙计。你有理由救了我的命【参考方案2】:

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

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

【讨论】:

谢谢伙计。你拯救了我的一天。 即使您在之后调用“die()”,这对您有用吗?出于某种原因,即使我调用 Session::save(),结果也是一样的。由于某种原因,我必须返回响应才能使其正常工作。我正在使用 L5.2 和 L5.3 刚刚注意到,当会话驱动程序设置为“cookies”时,这种情况不起作用,因为cookies不会立即保存,而是排队等待在结束时一起发送要求。这意味着,如果你 dd(),它不会工作! Sux0rs...【参考方案3】:

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

    dd(Session::all());

什么都不返回,但是:

    print_r(Session::all());

返回所有会话数据!

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

我移动了会话中间件

\Illuminate\Session\Middleware\StartSession::class

到属性 $middleware in

app/Http/Kernel.php

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

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

【讨论】:

以上是关于Laravel 会话数据不会跨页面加载的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 4.1 身份验证会话数据不会跨请求持久化

Laravel 6 会话和 CSRF Coo​​kie 未设置——每次页面加载的会话数据库中的新条目

Laravel - 创建一个会话数组并在每次重新加载页面时添加到它

仅在 Angular SPA 中的页面加载之间缓存会话数据

Laravel 5.2 - 会话不会在路由更改中持续存在

从验证重新加载页面后,带有 Select2 的 Laravel 输入值不会持续存在