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

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

Solutions Collecting From Web of "Доктрина 2: Могут ли сущности быть сохранены в сеансах?"

См. Раздел Сериализация сущностей в руководстве доктрины: (Все, что вы сохраняете в сеансе, сериализуется и десериализируется.)

Сериализация объектов может быть проблематичной и на самом деле не рекомендуется, по крайней мере, до тех пор, пока экземпляр объекта все еще содержит ссылки на прокси-объекты или все еще управляется EntityManager.

Существует техническое ограничение, которое не позволяет приватным свойствам сериализоваться при проксировании объекта (проксированные объекты с ленивой загрузкой).

Это означает, что вам нужно избегать использования private свойств для объектов, которые вы хотите сериализовать (вместо этого используйте protected объекты).

Кроме того, если ленивый загруженный объект не загружается во время сериализации, он не будет загружаться после де-сериализации. Поэтому перед его сериализацией необходимо убедиться, что объект полностью загружен.

Принятый ответ точно цитирует документацию Doctrine.

Тем не менее, есть еще несколько страниц на эту тему, объясняющих, как сериализовать сущности и хранить их в сеансе. Сущности в сеансе говорят, что сущности должны быть отсоединены перед сохранением в сеансе и затем объединены при восстановлении из сеанса.

На этой странице представлены разделы об отсоединении и объединении объектов.

Сохранение:

 $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); }