在 $_SESSION 中存储 Doctrine 对象

Posted

技术标签:

【中文标题】在 $_SESSION 中存储 Doctrine 对象【英文标题】:Storing Doctrine Object in $_SESSION 【发布时间】:2011-07-14 21:39:32 【问题描述】:

嘿, 我现在遇到了一个神秘的问题...... 我的网站上有登录服务。 我使用 Doctrine 作为 ORM。 当用户输入正确的用户名和密码组合时,我尝试将检索到的用户对象存储在我的会话中以备后用。

$user = new models\User;
$user = $em->getRepository('models\User')->findOneBy(array(
           'username' => $this->input->post('username'),
           'password' => hash("sha512", $this->input->post('password'))
           ));

   if($user != NULL) 
        session_start();
        $_SESSION['user'] = $user;
    redirect('user');
    

这是我登录的一部分

       /**
         * @ManyToOne(targetEntity="Country")
         * @JoinColumn(name="country_id", referencedColumnName="id")
         */
        private $country;

用户具有不同的属性,如国家、地址等。

所以我的问题是: 如果用户的字段 Country 为空(在数据库中),则登录工作正常......但如果用户被分配到一个国家(国家只有 id 和 name),我的系统将失败。 重定向后 $_SESSION 中没有 $user 没有php错误或类似的东西..变量就消失了

将 id 存储在会话中并在每次页面加载时加载用户会更好吗?

【问题讨论】:

【参考方案1】:

将ID存储在会话中并加载用户会更好吗 每个页面加载?

当然。用户数据可能在下一页加载时已经更改,因此您显然需要从数据库中刷新数据,而不是从会话中读取用户的旧数据。

参考:

PHP: Storing 'objects' inside the $_SESSION

【讨论】:

【参考方案2】:

除非您找到某种方法来使用_sleep and _wakeup 存储对象的状态并在不丢失引用的情况下对其进行序列化,否则您不能将对象放入会话中。

我确实会存储 id 并在下一次请求时重新检索它。

【讨论】:

以上是关于在 $_SESSION 中存储 Doctrine 对象的主要内容,如果未能解决你的问题,请参考以下文章

存储在 $_SESSION 但显示在 $_COOKIES 数组中的值

如何在 $_SESSION 中存储和检索错误数组

将所有 POST 数据存储在 SESSION 中

我可以将类实例存储在 $_SESSION 空间中吗?

在 Node 中使用 MemoryStore 存储会话数据,类似于 PHP 中的 $_SESSION['data'] = value

php 使用Ajax在$ _SESSION中存储产品