Внутри прослушивателя сущности Doctrine, в методе preUpdate (где у меня есть доступ как к старому, так и к новому значению любого поля сущности) я пытаюсь сохранить объект, не связанный с фокусным.
По сути, у меня есть объект A, и когда я меняю значение в одном из полей, которые хочу записать, в таблице project_notification, поля oldValue, newValue и другие.
Если я не выполню очистку внутри метода preUpdate, новый объект уведомления не будет сохранен в БД. Если я его сброшу, я попаду в бесконечный цикл.
Это метод preUpdate:
Код: Выделить всё
public function preUpdate(ProjectTolerances $tolerances, PreUpdateEventArgs $event)
{
if ($event->hasChangedField('riskToleranceFlag')) {
$project = $tolerances->getProject();
$em = $event->getEntityManager();
$notification = new ProjectNotification();
$notification->setValueFrom($event->getOldValue('riskToleranceFlag'));
$notification->setValueTo($event->getNewValue('riskToleranceFlag'));
$notification->setEntity('Entity'); //TODO substitute with the real one
$notification->setField('riskToleranceFlag');
$notification->setProject($project);
$em->persist($notification);
// $em->flush(); // gives infinite loop
}
}
Вот обновленная версия слушателя:
Код: Выделить всё
class ProjectTolerancesListener
{
protected $toBePersisted = [];
public function preUpdate(ProjectTolerances $tolerances, PreUpdateEventArgs $event)
{
$uow = $event->getEntityManager()->getUnitOfWork();
// $hasChanged = false;
if ($event->hasChangedField('riskToleranceFlag')) {
$project = $tolerances->getProject();
$notification = new ProjectNotification();
$notification->setValueFrom($event->getOldValue('riskToleranceFlag'));
$notification->setValueTo($event->getNewValue('riskToleranceFlag'));
$notification->setEntity('Entity'); //TODO substitute with the real one
$notification->setField('riskToleranceFlag');
$notification->setProject($project);
if(!empty($this->toBePersisted))
{
array_push($toBePersisted, $notification);
}
else
{
$toBePersisted[0] = $notification;
}
}
}
public function postFlush(LifecycleEventArgs $event)
{
if(!empty($this->toBePersisted)) {
$em = $event->getEntityManager();
foreach ($this->toBePersisted as $element) {
$em->persist($element);
}
$this->toBePersisted = [];
$em->flush();
}
}
}
1) Я не знаю, смогу ли я это сделать
2) Кажется, это немного перебор
Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/307 ... y-listener