Доктрина 2: Могут ли сущности быть сохранены в сеансах?

У меня возникла проблема с ленивой загрузкой после сохранения объекта в сессии PHP. Есть ли обходной путь для этого?

Ответ 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);
}