将实体保存到PHP会话后,我遇到了延迟加载的问题。这有什么解决方法吗?
答案 0 :(得分:15)
请参阅学说手册中的Serializing Entities :(您在会话中保存的所有内容都已序列化并反序列化。)
序列化实体可能会出现问题而且实际上并不值得推荐,至少只要实体实例仍然保留对代理对象的引用或者仍然由EntityManager进行管理即可。
存在技术限制,避免在代理实体时代理化私有属性(延迟加载的实体被代理)。
这意味着您必须避免对要序列化的实体使用private
属性(而是使用protected
个实体)。
此外,如果在序列化时未加载延迟加载的实体,则在反序列化后将无法加载。因此,在序列化之前,您必须确保实体已完全加载。
答案 1 :(得分:3)
接受的答案准确引用了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);
}