Php Laravel会话数据在页面加载时不粘滞
我尝试运行以下代码:Php Laravel会话数据在页面加载时不粘滞,php,session,laravel,laravel-4,Php,Session,Laravel,Laravel 4,我尝试运行以下代码: Session::put('progress', '5%'); dd(Session::get('progress')); 这将在转储中显示“5%” 如果我重新运行同一页面,但注释掉Session::put('progress','5%”)因此,只有dd()行被调用,我得到一个空值,而不是上一个页面加载中存储的5%的值 这是我的会话配置,因此我知道它应该存储数据: 'driver' => 'native', 'lifetime' => 120, 'expir
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完成其应用程序生命周期之前终止了脚本,所以放入会话(但尚未存储)的值也被终止 当Laravel应用程序生命周期开始时,在应用程序生命周期结束之前,
会话
中的任何值都不会被存储。也就是说,在会话
中放入的任何值都将最终/真正地存储
如果您进行检查,您将发现上述行为相同:
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'));
});
Session::put('progress', '5%');
Session::save();
对我来说,即使数据已正确存储到会话中:
dd(Session::all());
不返回任何内容,但:
print_r(Session::all());
返回所有会话数据 在我的例子中,我在一个请求中闪现了变量,然后在另一个请求中将其放入会话(使用相同的名称)
不幸的是,终止方法遍历了所有以前刷新的属性并清理了我新创建的会话属性(它在以前的请求中被刷新了,所以laravel认为它不再是必需的,并且无法判断它是新创建的)。我找到了调试
内核->终止emidware
方法。您可以在终止方法中放置断点。在某个阶段,它会到达Store->ageFlashData
。这是负责删除我的属性的方法。我移动了会话中间件
\Illumb\Session\Middleware\StartSession::class
指向中的属性$middleware
app/Http/Kernel.php
在这种情况下,您需要将其从web组($middlewareGroups)中删除
它帮助了我,我希望它也能帮助你我相信这是因为你在用
dd()
杀死脚本,在Laravel完成其生命周期之前,值没有存储到会话中。尝试在不使用dd
的情况下输入一个值,以完成整个Laravel生命周期。然后,在那之后,试着找回它。非常好!感谢您不仅提供了解决方案,而且对管道系统进行了详细的解释。:)我可以强制Laravel立即写入会话数据吗?我试图用它来存储通过AJAX访问的进程的进度。laravel会话在哪里存储这些值?我在会话存储中看不到它们。在新安装中,会话存储驱动程序是磁盘文件。非常好的家伙。你用理智救了我的命,汉克斯。你救了我一天。即使你马上叫“die()”,这对你有用吗?出于某种原因,即使调用Session::save(),结果也是一样的。出于某种原因,我必须返回回复才能使其正常工作。我在使用L5.2和L5.3时刚刚注意到,当会话驱动程序设置为“Cookie”时,这种情况不起作用,因为Cookie不会立即保存,并且会在请求结束时排队成批发送。这意味着,如果你dd(),它将不起作用!Sux0rs。。。
print_r(Session::all());