我尝试运行以下代码:
Session::put('progress', '5%');
dd(Session::get('progress'));
这将在转储中显示“5%”。
如果我重新运行同一页但注释掉Session::put('progress', '5%');
以便只调用dd()
行,则会得到一个空值而不是前一页加载中存储的5%值。
这是我的会话配置,所以我知道应该存储数据:
'driver' => 'native',
'lifetime' => 120,
'expire_on_close' => false,
为什么Laravel不会跨页面加载存储会话数据?
答案 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);
}
如果要测试它,请执行以下操作:
在会话中存储值而不会终止脚本。
Route::get('test', function() {
Session::put('progress', '5%');
// dd(Session::get('progress'));
});
检索已经存储的值:
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)