В настоящее время у меня есть объект, который я бы хотел немного изменить при загрузке. Эта модификация будет одноразовым изменением, которое затем будет сохраняться в новом поле вместе с сущностью.
Чтобы прояснить мою текущую цель: сущность – это «Местоположение» и является частью вложенного набора. Он имеет имя, значения lft / rgt и идентификатор. Одна вычислительно дорогостоящая задача, которую я выполнял с этим объектом, заключалась в том, чтобы получить полный путь к местоположению и отобразить его как текст. Например, с местоположением местоположения «Ватерлоо» я хочу показать «Ватерлоо | Лондон | Великобритания». Это включает в себя перемещение по всему набору (к корневому узлу).
Чтобы уменьшить стоимость этого, я создал новое поле в объекте Location, которое может быть помечено этим значением (и обновлено как / когда имя местоположения (или любое местоположение в дереве) изменяется). Учитывая, что мое приложение находится в живом состоянии, мне нужно избегать запуска этого процесса как одного, так как это может привести к довольно интенсивному одноразовому удару по БД, вместо этого я бы хотел применить это обновление как и когда каждое место (без это значение). Я предположил, что механизм событий postLoad Doctrine был бы идеальным для достижения этого, однако ..
Объекты Location не загружаются непосредственно моим приложением, они всегда будут обратной стороной отношения. С этим умом и тем фактом, что событие 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); } }