Событие Doctrine postLoad для ассоциаций

В настоящее время у меня есть объект, который я бы хотел немного изменить при загрузке. Эта модификация будет одноразовым изменением, которое затем будет сохраняться в новом поле вместе с сущностью.

Чтобы прояснить мою текущую цель: сущность – это «Местоположение» и является частью вложенного набора. Он имеет имя, значения lft / rgt и идентификатор. Одна вычислительно дорогостоящая задача, которую я выполнял с этим объектом, заключалась в том, чтобы получить полный путь к местоположению и отобразить его как текст. Например, с местоположением местоположения «Ватерлоо» я хочу показать «Ватерлоо | Лондон | Великобритания». Это включает в себя перемещение по всему набору (к корневому узлу).

Чтобы уменьшить стоимость этого, я создал новое поле в объекте Location, которое может быть помечено этим значением (и обновлено как / когда имя местоположения (или любое местоположение в дереве) изменяется). Учитывая, что мое приложение находится в живом состоянии, мне нужно избегать запуска этого процесса как одного, так как это может привести к довольно интенсивному одноразовому удару по БД, вместо этого я бы хотел применить это обновление как и когда каждое место (без это значение). Я предположил, что механизм событий postLoad Doctrine был бы идеальным для достижения этого, однако ..

Объекты Location не загружаются непосредственно моим приложением, они всегда будут обратной стороной отношения. С этим умом и тем фактом, что событие postLoad доктрины:

  • Не загружает (разрешает доступ) любые связанные данные
  • Только уволен для владения сущностями

Я не могу мягко вносить эти изменения.

У кого-нибудь есть какие-либо советы или опыт?

Related of "Событие Doctrine postLoad для ассоциаций"

Я смог загрузить связанные объекты Location в событие postLoad с помощью метода initializeObject () в Entity Manager.

/** * Upon loading the object, if the location text isn't set, set it * @param \Doctrine\ORM\Event\LifecycleEventArgs $args */ public function postLoad(\Doctrine\ORM\Event\LifecycleEventArgs $args) { $this->em = $args->getEntityManager(); $entity = $args->getEntity(); if ($entity instanceof \Entities\Location) { if (is_null($entity->getPathText())) { $entity->setPathText("new value"); $this->em->flush($entity); } } elseif ($entity instanceof {parent Entity}) { $location = $entity->getLocation(); // This triggers the postLoad event again, but this time with Location as the parent Entity $this->em->initializeObject($location); } }