Метод 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,
который возвращает дочерний билдер формы