我尝试运行以下代码:
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 应用程序生命周期开始时,
put
中的任何值 Session
都不会被存储,直到应用程序生命周期结束。也就是说,put
中的任何值Session
最终/真的会是stored
。
如果您检查来源,您会发现相同的上述行为:
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'));
});
回答非常好。我只是想补充一点,如果您需要立即存储数据,您可以使用 save 方法:
Session::put('progress', '5%');
Session::save();
dd(Session::all());
不返回任何内容,但是:
print_r(Session::all());
返回所有会话数据!
不幸的是,终止方法遍历了所有先前刷新的属性并清除了我新创建的会话属性(它在之前的请求中被刷新,因此 laravel 认为不再需要它并且无法判断它是新创建的)。我想出了调试
Kernel->terminateMiddleware
的方法。您可以在终止方法中放置断点。在某个阶段它会达到
Store->ageFlashData
。这是负责删除我的财产的方法。
$request->session()->put('key', 'value');
$request->session()->save();
干杯:)