【发布时间】:2011-09-19 15:11:55
【问题描述】:
我在将实体保存到 PHP 会话后遇到延迟加载问题。有什么解决方法吗?
【问题讨论】:
标签: php doctrine doctrine-orm
我在将实体保存到 PHP 会话后遇到延迟加载问题。有什么解决方法吗?
【问题讨论】:
标签: php doctrine doctrine-orm
请参阅教义手册中的Serializing Entities:(您在会话中保存的所有内容都会被序列化和反序列化。)
序列化实体可能会出现问题,因此并不真正推荐,至少只要实体实例仍持有对代理对象的引用或仍由 EntityManager 管理,则不会。
有一个技术限制是在代理实体时避免私有属性被序列化(延迟加载的实体被代理)。
这意味着您必须避免为要序列化的实体使用private 属性(改用protected 实体)。
此外,如果延迟加载的实体在序列化时未加载,则在反序列化后将无法加载。因此,您必须确保实体在序列化之前已完全加载。
【讨论】:
__clone 方法来确保实体被加载,并移除对实体持久化器的引用。 __clone 由 PHP 在克隆上调用,就在克隆之后。
接受的答案准确地引用了 Doctrine 文档。
但是,关于如何序列化实体并将它们存储在会话中的主题的页面很少。 Entities in the Session 表示实体在存储到会话之前必须分离,然后在从会话中恢复时合并。
On this page 有关于detaching 和merging 实体的部分。
保存:
$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);
}
【讨论】: