laravel session()无法存储新的会话键值对

vfh0ocws  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(122)

我不知道为什么会发生这种情况,我已经试着调试了一个小时,我有以下代码:

// 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");
    }
}

为什么?

sc4hvdpw

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()方法在当前会话示例中设置指定的键值对。下面是更新的代码:

public function some_method(Request $request)
{
if (session()->missing('key1')) {
    $request->session()->put('key1', 'some_value1');
    dd("key1 is missing");
}

if (session()->missing('key2')) {
    $request->session()->put('key2', 'some_value2');
    dd("key2 is missing");
}
}

通过使用$request->session()->put('key 1','some_value1')和$request->session()->put('key 2','some_value2'),可以确保在同一个会话示例上设置了这些键,从而可以正确地检查它们的存在。

相关问题