Сохранение других сущностей внутри preUpdate прослушивателя сущностей DoctrinePhp

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Сохранение других сущностей внутри preUpdate прослушивателя сущностей Doctrine

Сообщение Anonymous »

Для ясности продолжу здесь обсуждение, начатое здесь.

Внутри прослушивателя сущности 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
}
}
Немного погуглив, я обнаружил, что вы не можете вызвать сброс внутри слушателей, и здесь предлагается хранить данные, которые нужно сохранить, в массиве, чтобы сбросить их позже. onFlush. Тем не менее, это не работает (и, вероятно, не должно работать, поскольку экземпляр класса слушателя уничтожается после вызова preUpdate, поэтому все, что вы храните в качестве защищенного атрибута на уровне класса, теряется, когда вы позже вызываете onFlush , или я что-то упустил?).

Вот обновленная версия слушателя:

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»