学说2:实体可以保存到会话中吗?

时间:2011-09-19 15:11:56

标签: php doctrine doctrine-orm

将实体保存到PHP会话后,我遇到了延迟加载的问题。这有什么解决方法吗?

2 个答案:

答案 0 :(得分:15)

请参阅学说手册中的Serializing Entities :(您在会话中保存的所有内容都已序列化并反序列化。)

  

序列化实体可能会出现问题而且实际上并不值得推荐,至少只要实体实例仍然保留对代理对象的引用或者仍然由EntityManager进行管理即可。

存在技术限制,避免在代理实体时代理化私有属性(延迟加载的实体被代理)。

这意味着您必须避免对要序列化的实体使用private属性(而是使用protected个实体)。

此外,如果在序列化时未加载延迟加载的实体,则在反序列化后将无法加载。因此,在序列化之前,您必须确保实体已完全加载。

答案 1 :(得分:3)

接受的答案准确引用了Doctrine文档。

但是,关于如何序列化实体并将其存储在会话中的主题还有更多页面。 Entities in the Session表示实体必须在存储到会话之前分离,然后在从会话恢复时合并。

On this page有关于detachingmerging个实体的部分。

保存:

$em = GetEntityManager();
$user = $em->find("User", 1);
$em->detach($user);
$_SESSION['user'] = $user;

恢复:

$em = GetEntityManager();
session_start();
if (isset($_SESSION['user']) && $_SESSION['user'] instanceof User) {
    $user = $_SESSION['user'];
    $user = $em->merge($user);
}