我不知道为什么会发生这种情况,我已经试着调试了一个小时,我有以下代码:
// some controller
public function some_method(Request $request)
{
if(session()->missing('key1')) {
session(['key1' => 'some_value1']);
dd("key1 is missing");
}
if(session()->missing('key2')) {
session(['key2' => 'some_value2']);
dd("key2 is missing");
}
}
在第一次刷新之后,我得到了"key1 is missing"
,因为在第一次请求时没有设置它。但它一直显示"key2 is missing"
。它进入if
条件,但不像key1
那样创建key2
。
**更新:**如果将key2
设置在if
之外,则可以工作:
// some controller
public function some_method(Request $request)
{
// setting key2 outside the if
session(['key2' => 'some_value2']);
if(session()->missing('key1')) {
session(['key1' => 'some_value1']);
dd("key1 is missing");
}
if(session()->missing('key2')) {
session(['key2' => 'some_value2']);
dd("key2 is missing");
}
}
为什么?
1条答案
按热度按时间sc4hvdpw1#
在原始代码中,问题与检查会话键是否存在以及设置其值的顺序有关。
当您第一次访问该页面并且会话为空时,条件session()->missing('key 1')的计算结果为true,因为'key 1'尚未设置。在该条件中,使用session(['key 1' => 'some_value1'])将'key 1'设置为'some_value1'。
但是,在下一个条件session()->missing('key 2')中,您预期'key 2'会丢失,因为您还没有设置它。但问题在于,session()函数启动一个新的会话示例,并且每次调用session()都返回一个新的会话示例。因此,当调用session(['key 2' => 'some_value2'])时,它会在不同的session示例上设置'key 2',这不会影响后续对session()->missing('key 2')的调用。
在更新后的代码中,您在if条件之外设置了'key 2',确保无论是否缺少'key 2',都始终设置它。这就是为什么它在这种情况下工作。
要修复原始代码,同时保持相同的逻辑,可以使用put()方法而不是session()辅助函数来设置会话值。put()方法在当前会话示例中设置指定的键值对。下面是更新的代码:
通过使用$request->session()->put('key 1','some_value1')和$request->session()->put('key 2','some_value2'),可以确保在同一个会话示例上设置了这些键,从而可以正确地检查它们的存在。