Доктрина 2: Можно ли сохранять сущности в сеансах? - PullRequest
10 голосов
/ 19 сентября 2011

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

Ответы [ 2 ]

15 голосов
/ 19 сентября 2011

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

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

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

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

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

3 голосов
/ 22 октября 2014

Принятый ответ точно цитирует документацию 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);
}
...