我用Livewire制作了一个深度嵌套的反应式表单渲染器。为了做到这一点,我找到了一个全局存储模式,这样层次结构中的任何组件都可以引用方法getStore()
和setStore($store)
。
它似乎是有效的,我可以用驻留在json文件中的数据或通过使用Cache facade来实现存储getter/setter方法。然而,我的第一选择是使用会话,类似于:
public function getStore()
{
return Session::get($this->store_id);
}
public function setStore($store)
{
Session::put($this->store_id, $store);
}
但是,我无法将此专门用于Session。很难调试为什么会这样。有时会话密钥似乎没有在应该设置的时候设置,即使日志记录表明它是在没有任何错误的情况下设置的。我还尝试用Session::save();
显式地持久化它,以防它无法到达通常持久化的Terminable中间件。没有效果。
你知道为什么我的存储设置适用于file_get_contents/Cache而不适用于Session吗?
同样的情况也发生在我身上。刷新页面后,会话将显示旧数据。我甚至尝试使用带有Session::forget()
函数的setter,但没有成功。
private function set($cart)
{
Session::forget('cart');
Session::put('cart', $cart);
Session::save();
}
没有错误,Log::debug('after-set' . request()->session()->get('cart')['products'])
和Log::debug('after-page-refresh' . request()->session()->get('cart')['products'])
的测井数据显示了2个不同的阵列。我发现唯一一致的是,在页面刷新之后——只有最后一个Session::put()
请求没有保存——所有其他更改都在生效之前。我可能不得不像您一样使用Cache,因为这种不一致性对生产来说是有风险的。