Php 无法在其他控制器中获取会话数据

Php 无法在其他控制器中获取会话数据,php,session,symfony-3.4,Php,Session,Symfony 3.4,我用的是symfony3.4。我能够在同一个控制器内设置和获取会话数据。但是在其他控制器中获取相同的会话数据会引发异常:“调用成员函数get()on null” 下面是我正在使用的代码: Controller1.php(Working) $this->session = new Session(); $this->session->start(); /*** Set Session Data ***/ $this->session-&

我用的是symfony3.4。我能够在同一个控制器内设置和获取会话数据。但是在其他控制器中获取相同的会话数据会引发异常:“调用成员函数get()on null”

下面是我正在使用的代码:

   Controller1.php(Working)
   $this->session = new Session();
   $this->session->start();    
   /*** Set Session Data ***/
   $this->session->set('userid', $dbres [0]['user_id']);

   /*** Get Session Data ***/
   $user_id = $this->session->get('userid');

   Controller2.php(Not Working) 
   /*** Get Session Data ***/
   $user_id = $this->session->get('userid');

   Exception : "Call to a member function get() on null"
Controller1.php(工作)

Controller2.php(不工作)

  /*** Get Session Data ***/
   $this->session = new Session();
   $this->session->start();    
   $user_id = $this->session->get('userid');
异常:“在null上调用成员函数get()”,因为您尚未在控制器2上定义
$this->session


你为什么不在行动中通过SessionInterface?像这样:

public function showAction(SessionInterface $session)
{
    $session->set('user_id', 1);
}
因此,在控制器2中,您可以获得如下用户id:

public function showAction(SessionInterface $session)
{
    $session->get('user_id'); // You can test $session->has('user_id')
}
如果要创建特定会话,请使用静态方法getInstance和私有构造函数创建用户(或其他)类。在create方法中,测试if session exist if true返回session else调用构造函数。这里有一个例子:

public static function getInstance($new = false)
{
    if(is_null(self::$_session)) {
        self::$_session = new Session();
        self::$_session->start();
    }

    if($new)
    {
        self::$_session->set('user_instance', new self(self::$_session));
        return self::$_session->get('user_instance');
    }

    if(!self::$_session->has('user_instance')) {
        self::$_session->set('user_instance', new self(self::$_session));
    }

    return self::$_session->get('user_instance');
}

我希望它能对您有所帮助。

尝试在controller 2上启动会话。我已经在Controller2.php的构造函数中创建了一个实例。无法获取异常,但我仍然无法读取会话数据。它将不起作用。两个文件都是不同的。创建一个公共控制器并在公共上构造会话,然后从公共控制器扩展controller1和controller2。
public static function getInstance($new = false)
{
    if(is_null(self::$_session)) {
        self::$_session = new Session();
        self::$_session->start();
    }

    if($new)
    {
        self::$_session->set('user_instance', new self(self::$_session));
        return self::$_session->get('user_instance');
    }

    if(!self::$_session->has('user_instance')) {
        self::$_session->set('user_instance', new self(self::$_session));
    }

    return self::$_session->get('user_instance');
}