У меня возникла проблема с ленивой загрузкой после сохранения объекта в сессии PHP. Есть ли обходной путь для этого?
Доктрина 2: Могут ли сущности быть сохранены в сеансах?
Ответ 1
См. Сериализация объектов в руководстве доктрины: (Все, что вы сохраняете в сеансе, сериализуется и десериализируется.)
Сериализация объектов может быть проблематичной и на самом деле не рекомендуется, по крайней мере, не до тех пор, пока экземпляр объекта все еще содержит ссылки на прокси-объекты или все еще управляется EntityManager.
Существует техническое ограничение, которое не позволяет приватным свойствам сериализоваться при проксировании объекта (проксированные объекты с ленивой загрузкой).
Это означает, что вам нужно избегать использования свойств private
для объектов, которые вы хотите сериализовать (используйте вместо них protected
).
Кроме того, если объект с задержкой загрузки не загружается во время сериализации, он не будет загружаться после де-сериализации. Таким образом, вы должны убедиться, что объект полностью загружен перед его сериализацией.
Ответ 2
Принятый ответ точно цитирует документацию Doctrine.
Тем не менее, есть еще несколько страниц по этому вопросу, в которых объясняется, как сериализовать сущности и хранить их в сеансе. Объекты в сеансе сообщают, что сущности должны быть отсоединены перед сохранением в сеансе и затем объединены при восстановлении из сеанса.
На этой странице есть разделы о 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);
}