Когда форма отправлена, данные представления преобразуются в нормализованные данные.Как я понял из чтения исходного кода, есть массив преобразователей представления, каждый из которых вызывается по очереди.
У меня была проблема с этим процессом.Мое поле ввода - это элемент выбора с несколькими вариантами выбора.Я на самом деле использую селектор начальной загрузки 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