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 6 会话和 CSRF Cookie 未设置——每次页面加载的会话数据库中的新条目