Я использую doctrine-mongodb-odm-1.0.0-BETA10
и пытаюсь предоставить некоторую пользовательскую логику на основе \InitialDocument
во время выполнения события preUpdate
.
Допустим, \InitialDocument
получил некоторое состояние, которое должно вести себя как начальное для нового \StateDocument
. Я делаю что-то вроде этого:
class InitDocListener implements \Doctrine\Common\EventSubscriber {
public function getSubscribedEvents()
{
return [
Events::preUpdate
];
}
public function preUpdate($args){
$document = $args->getDocument();
if($document instanceOf InitialDocument && $document->getState() == 'mine'){
$stateDocument = new \StateDocument();
$stateDocument->setInitDocument($document);
$args->getDocumentManager()->persist($stateDocument);
//no flush cause recursion happens
}
}
}
prePersist
событие \StateDocument
происходит, но новый документ не сохраняется в БД. и событие postPersist
соответственно никогда не будет запущено.
Есть еще некоторая пользовательская логика, но все в области событий. В какой-то момент эта логика может вызвать исключение, которое должно остановить событие обновления InitialDocument
, поэтому состояние InitialDocument
зависит от процесса создания \StateDocument
в бизнес-сфере.
Как я могу решить эту проблему? preFlush
событие, выполняемое перед пересчетом changeSet, не определяет экземпляр InitialDocument
. Так что это своего рода уловка «искать» обновления в preFlush
и заставляет меня думать, что это неправильный способ. Пожалуйста, посоветуйте мне правильный. Спасибо.