Я использую Symfony 3.4 и доктрину, и у меня проблема с данными, измененными прослушивателем событий.
Если форма отправлена и Doctrine PreUpdate EventLister изменяет значение сущности, это не отображается в форме.
Пример с сущностью под названием Activity, у которой есть атрибут $ number:
/**
* @ORM\Entity
* @ORM\Table(name = "activity")
* @ORM\EntityListeners({"ActivityListener"})
*/
class Activity
{
/**
* @ORM\Column(type = "integer")
*/
private $number ;
...
Getters, Setters an other stuff...
}
И прослушиватель событий:
class ActivityListener
{
// Events
public function get()
{
return ( ['preUpdate']);
}
public function preUpdate(Activity $activity, LifecycleEventArgs $args)
{
$activity->setNumber(1) ;
}
}
Обработка формы в контроллере, предполагая, что я отправил форму, например, 0 как значение для моего числового поля:
class ActivityController
{
...
// Create form and handle request
$form = $this->createForm (ActivityForm::class, $activity) ;
$this->form->handleRequest ( $this->request ) ;
if ( $this->form->isSubmitted() )
{
// $activity->number == 0 as entred in HTML Form
$this->em->persist($activity) ;
$this->em->flush();
// $activity->number == 1 as set in PreUpdate Event
}
$this->view = $this->form->createView () ;
...
}
Таким образом, EventListener правильно присвоил полю «число» значение 1 и правильно сохранило его в базе данных.
Но форма отображается с "0" в числовом поле, вероятно, потому что значения уже получены с помощью команды createForm?
Как я могу добиться, чтобы новое значение, которое мой прослушиватель событий записал в объект, правильно отображалось в форме?
Спасибо и добрые пожелания, Саша
Да, именно так. Форма отправляется с полем, содержащим значение 0. В сущности значение установлено на 1 в событии preUpdate, и это значение сохраняется в базе данных. Таким образом, форма должна содержать значение 1.






событие preUpdate происходит после отправки формы, поэтому в форме все еще отображается 0.
Если вы хотите, чтобы оно уже было 1, событие preUpdate - не то, что вам следует использовать. Вы можете обновить его вручную или установить 1 как значение по умолчанию в поле формы.
Спасибо за ваш ответ. На самом деле моя проблема немного сложнее - я просто сократил пример кода, чтобы сделать его менее подробным. В форме есть элемент списка. В зависимости от выбора списка устанавливается другое поле согласно соответствующему запросу к базе данных. Итак, в моем триггере preEvent есть условие вроде «если выбор списка = 1, то получить значение $ из базы данных», «если выбор списка = 2, то получить другое значение $ из базы данных». Итак, мне нужны отправленные данные формы для определения нового значения $, и я хочу отобразить это новое значение $ в форме, чтобы пользователь мог изменить его, если захочет.
Я нашел решение своей проблемы. После сохранения объекта я просто воссоздаю форму, чтобы она содержала измененные значения.
Примерно так в контроллере, который обрабатывает отправку формы:
$this->form->handleRequest ( $this->request ) ;
if ($this->form->isValid() )
{
// Persist data
$this->em->persist($this->entity) ;
// At this point, entity data has been modified by PreUpdate Event
$this->em->flush();
$this->flashbag->add ( 'success', $this->translator->trans('form.info.save') ) ;
// Recreate form so the modified data is instantly shown in the form
$this->createForm (EntityForm::class, $entity ) ;
$this->view = $this->form->createView () ;
}
Итак, вы хотите, чтобы значение было равно 1, когда оно отображается в форме?