Laravel 会话外观意外行为

Laravel Session Facade unexpected behaviour

在我的 Laravel 5.4 项目中,我试图像这样在我的控制器方法中存储状态令牌..

 use Illuminate\Support\Facades\Session ;
 ... 
 public function authorize()
 {
    Session::set('state', $client->getState());

       A lot of code here...

    header('Location: ' . $authorizationUrl);
        exit;
 }

我也试过使用辅助函数

  session('state', $client->getState());

但无论我如何尝试,会话都不会创建或保留。

所以我转而直接使用 Symfony 组件..

use Symfony\Component\HttpFoundation\Session\Session;
...
public function authorise()
{
   $session = new Session();
   $session->set('state', $client->getState());
   ...
}

这样做效果很好。任何解释为什么立面不起作用?

作为参考,如果其他人有这样的问题,问题是由重定向引起的,在函数完成之前,或加载视图等(即session 存储在 Laravel 应用程序 "lifecycle" 的末尾。)除了重定向,包括使用 dd()die()等等

例如如果您的方法基本上像这样,Sessions 就可以正常工作。

public function myAwesomeMethod($params)
{
    Session::put('theKey','theValue');

    return view('theView'); //Session gets stored at this point.
}

但是,如果您的方法看起来像这样,您就会遇到问题。

public function myCoolMethod($authUrl)
{
    Session::put('theKey','theValue');

    header('Location: ' . $authUrl); //Session seems to be lost here.
    exit;
}

解决方案很简单,但由于我对 Laravel 会话不熟悉,所以我错过了。在最后一个示例中,只需将 save() 方法添加到会话 class(如果使用 Facade),如下所示。

public function myCoolMethod($authUrl)
{
     Session::put('theKey','theValue');
     Session::save();// Session gets stored immediately

     header('Location: ' . $authUrl); 
     exit;
 }