Symfony показывает изменения EventListener в форме

Я использую 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?

Как я могу добиться, чтобы новое значение, которое мой прослушиватель событий записал в объект, правильно отображалось в форме?

Спасибо и добрые пожелания, Саша

Итак, вы хотите, чтобы значение было равно 1, когда оно отображается в форме?

Liora Haydont 31.05.2018 20:42

Да, именно так. Форма отправляется с полем, содержащим значение 0. В сущности значение установлено на 1 в событии preUpdate, и это значение сохраняется в базе данных. Таким образом, форма должна содержать значение 1.

Sascha 01.06.2018 20:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
387
2

Ответы 2

событие preUpdate происходит после отправки формы, поэтому в форме все еще отображается 0.

Если вы хотите, чтобы оно уже было 1, событие preUpdate - не то, что вам следует использовать. Вы можете обновить его вручную или установить 1 как значение по умолчанию в поле формы.

Спасибо за ваш ответ. На самом деле моя проблема немного сложнее - я просто сократил пример кода, чтобы сделать его менее подробным. В форме есть элемент списка. В зависимости от выбора списка устанавливается другое поле согласно соответствующему запросу к базе данных. Итак, в моем триггере preEvent есть условие вроде «если выбор списка = 1, то получить значение $ из базы данных», «если выбор списка = 2, то получить другое значение $ из базы данных». Итак, мне нужны отправленные данные формы для определения нового значения $, и я хочу отобразить это новое значение $ в форме, чтобы пользователь мог изменить его, если захочет.

Sascha 01.06.2018 23:10

Я нашел решение своей проблемы. После сохранения объекта я просто воссоздаю форму, чтобы она содержала измененные значения.

Примерно так в контроллере, который обрабатывает отправку формы:

$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 () ;
}

Другие вопросы по теме