Какие преобразователи представления по умолчанию используются формами Symfony? - PullRequest
0 голосов
/ 23 сентября 2019

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

У меня была проблема с этим процессом.Мое поле ввода - это элемент выбора с несколькими вариантами выбора.Я на самом деле использую селектор начальной загрузки 4.В коде PHP я добавляю запись EntityType в конструктор форм.Но так как количество возможных вариантов составляет почти 40 КБ, я не могу добавить все из них как варианты.На самом деле, я только добавляю текущее значение в качестве выбора.Затем я использую автозаполнение и вызов ajax для загрузки большего количества записей на основе пользовательского ввода.

Проблема возникла, когда я выбрал значение, которое впоследствии было загружено с помощью вызова ajax.Я не мог спасти это.Я увидел, что нормализованное значение этого поля было нулевым в отправленной форме, поэтому я добавил преобразователь представления, который (обратный) преобразовал бы id в сущность.Но я продолжал получать преобразование не удалось исключение.Он пришел от одного из трансформаторов еще до того, как ценность достигла моего нового трансформатора.Кажется, что Symfony каким-то образом добавил (по умолчанию?) Преобразователь представления в процесс, который не смог выполнить свою работу.Я не мог понять, когда этот неисправный трансформатор был добавлен туда и что он на самом деле пытался сделать и почему он был там с самого начала.

Решение было таким же простым, как добавление одной строки, которая удаляет все преобразователи представления, перед добавлением моего собственного.Вот некоторый код из функции buildForm:

$builder->add('_client', EntityType::class, array(
  'required' => true,
  'class' => Client::class,
  'label' => 'Client',
  'attr' => ['class' => 'selectpicker', 'btn-light', 'data-live-search' => 'true', 'data-dropup-auto' => 'false'],
  'choice_label' => '_name',
  'choices' => [$builder->getData()->getClient()]
));
$builder->get('_client')->resetViewTransformers();
$builder->get('_client')->addViewTransformer($this->clientTransformer);

Что я не могу понять, так это то, какой преобразователь представления удаляется вызовом resetViewTransformers () и что вызывает преобразование этого представления.

Справочная информация о преобразователях модели Symfony: Как использовать преобразователи данных Symfony

...