Laravel Session Facade意外行为

时间:2017-08-28 21:39:53

标签: php laravel session laravel-5.4 php-7.1

在我的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());
   ...
}

这样做非常有效。任何解释为什么外立面不起作用?

1 个答案:

答案 0 :(得分:0)

作为参考,如果其他人有这样的问题,问题是由函数完成之前的重定向,oauth url,或者视图加载等引起的(即会话存储在最后Laravel应用程序“生命周期”。)此问题可以在除重定向之外的任何情况下表现出来,包括使用dd()die()等。

e.g。如果您的方法基本上像这样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()方法添加到Sessions类(如果使用Facade),如下所示。

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

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