РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
446 of 1361 menu

Метод addModelTransformer

Метод addModelTransformer класса FormBuilder добавляет модель-трансформер в форму. Модель-трансформер преобразует данные из модели (объекта, массива) в норму, понятную полю формы, и обратно. Первым параметром передаётся объект, реализующий интерфейс DataTransformerInterface, с методами transform и reverseTransform.

Трансформер применяется при установке данных в форму (преобразование модели в норму) и при отправке формы (преобразование нормы обратно в модель). Метод возвращает сам объект FormBuilder, что позволяет использовать цепочку вызовов.

Синтаксис

<?php public function addModelTransformer(DataTransformerInterface $modelTransformer): static ?>

Пример

Давайте создадим трансформер, который преобразует строку с датой в формате 'Y-m-d' в объект DateTime и обратно:

<?php namespace AppFormDataTransformer; use SymfonyComponentFormDataTransformerInterface; class DateToStringTransformer implements DataTransformerInterface { public function transform(mixed $date): string { if (null === $date) { return ''; } return $date->format('Y-m-d'); } public function reverseTransform(mixed $value): ?DateTime { if ('' === $value || null === $value) { return null; } return new DateTime($value); } } ?>

Теперь добавим этот трансформер к полю формы через метод addModelTransformer:

<?php namespace AppForm; use AppFormDataTransformerDateToStringTransformer; use SymfonyComponentFormAbstractType; use SymfonyComponentFormFormBuilderInterface; use SymfonyComponentFormExtensionCoreTypeTextType; use SymfonyComponentOptionsResolverOptionsResolver; class ArticleType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options): void { $builder ->add('createdAt', TextType::class) ->get('createdAt') ->addModelTransformer(new DateToStringTransformer()); } public function configureOptions(OptionsResolver $resolver): void { $resolver->setDefaults([ 'data_class' => Article::class, ]); } } ?>

При установке данных в форму значение поля createdAt из объекта Article будет преобразовано в строку методом transform. При отправке формы строка будет преобразована обратно в объект DateTime методом reverseTransform.

Пример

Давайте создадим трансформер, который преобразует массив идентификаторов в строку, разделённую запятыми, и обратно:

<?php namespace AppFormDataTransformer; use SymfonyComponentFormDataTransformerInterface; class ArrayToStringTransformer implements DataTransformerInterface { public function transform(mixed $array): string { if (!is_array($array)) { return ''; } return implode(',', $array); } public function reverseTransform(mixed $value): array { if ('' === $value || null === $value) { return []; } return explode(',', $value); } } ?>

Применим трансформер к полю формы:

<?php namespace AppForm; use AppFormDataTransformerArrayToStringTransformer; use SymfonyComponentFormAbstractType; use SymfonyComponentFormFormBuilderInterface; use SymfonyComponentFormExtensionCoreTypeTextType; use SymfonyComponentOptionsResolverOptionsResolver; class ArticleType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options): void { $builder ->add('tags', TextType::class) ->get('tags') ->addModelTransformer(new ArrayToStringTransformer()); } public function configureOptions(OptionsResolver $resolver): void { $resolver->setDefaults([ 'data_class' => Article::class, ]); } } ?>

Если в модели поле tags содержит массив ['a', 'b', 'c'], то в форме оно отобразится как строка "a,b,c". При отправке формы строка преобразуется обратно в массив.

Смотрите также

  • класс FormBuilder,
    который строит форму
  • метод addViewTransformer,
    который добавляет вью-трансформер
  • метод setDataMapper,
    который задаёт маппер данных формы
  • метод get,
    который возвращает дочерний билдер формы
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить