Метод addViewTransformer класса FormBuilder
Метод addViewTransformer класса FormBuilder добавляет
view-преобразователь (view transformer) к полю формы.
Первым параметром передаётся объект, реализующий интерфейс
DataTransformerInterface. Этот преобразователь работает
между нормализованными данными и данными, которые видит пользователь
в поле формы. Метод возвращает сам объект FormBuilder,
что позволяет строить цепочку вызовов.
View-преобразователь применяется после model-преобразователя.
Он полезен, когда нужно показать значение в форме в одном формате,
а хранить в модели - в другом. Например, хранить дату как объект
DateTime, а в поле показывать строку 'Y-m-d'.
Синтаксис
<?php
public function addViewTransformer(DataTransformerInterface $viewTransformer, bool $forcePrepend = false): static
?>
Первый параметр $viewTransformer - объект-преобразователь.
Второй параметр $forcePrepend определяет, добавить
преобразователь в начало или в конец цепочки. По умолчанию
преобразователь добавляется в конец.
Пример
Давайте создадим простой view-преобразователь, который переводит строку в верхний регистр при отображении и обратно при отправке:
<?php
namespace AppForm;
use SymfonyComponentFormDataTransformerInterface;
class UpperCaseTransformer implements DataTransformerInterface
{
public function transform(mixed $value): mixed
{
return strtoupper((string) $value);
}
public function reverseTransform(mixed $value): mixed
{
return strtolower((string) $value);
}
}
?>
Теперь добавим этот преобразователь к полю формы через метод
addViewTransformer:
<?php
namespace AppForm;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolver;
class ArticleType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('title', null, [
'label' => 'Article title',
])
->get('title')
->addViewTransformer(new UpperCaseTransformer());
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => null,
]);
}
}
?>
Если в поле ввести 'abcde', то при отображении формы
значение будет показано как 'ABCDE', а в модель
попадёт строка в нижнем регистре 'abcde'.
Пример
Давайте рассмотрим более практичный пример - преобразование
даты из объекта DateTime в строку для отображения
в текстовом поле:
<?php
namespace AppForm;
use DateTime;
use SymfonyComponentFormDataTransformerInterface;
use SymfonyComponentFormExceptionTransformationFailedException;
class DateToStringTransformer implements DataTransformerInterface
{
public function transform(mixed $value): mixed
{
if (null === $value) {
return '';
}
if (!$value instanceof DateTime) {
throw new TransformationFailedException('Expected a DateTime object.');
}
return $value->format('Y-m-d');
}
public function reverseTransform(mixed $value): mixed
{
if (empty($value)) {
return null;
}
$date = DateTime::createFromFormat('Y-m-d', $value);
if (false === $date) {
throw new TransformationFailedException('Invalid date format.');
}
return $date;
}
}
?>
Подключим преобразователь к полю формы:
<?php
namespace AppForm;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolver;
class ArticleType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('createdAt', null, [
'label' => 'Created at',
])
->get('createdAt')
->addViewTransformer(new DateToStringTransformer());
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => null,
]);
}
}
?>
В модель попадёт объект DateTime, а в поле формы
пользователь увидит строку в формате '2024-01-15'.
Смотрите также
-
класс
FormBuilder,
который строит форму и управляет её полями -
метод
add,
который добавляет поле в форму -
метод
addModelTransformer,
который добавляет model-преобразователь данных -
метод
get,
который возвращает дочерний элемент формы