在 $_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 数组中的值
在 Node 中使用 MemoryStore 存储会话数据,类似于 PHP 中的 $_SESSION['data'] = value