Новое в Symfony 5.2: Обратные вызовы отображения форм

Иногда объекты, обрабатываемые с помощью форм Symfony, не определяют ожидаемые методы получения/установки (например, getName() и setName()), но другие методы лучше согласованы с потребностями приложения (например, getName() и rename()).

В этих случаях вы можете использовать средство отображения данных формы для перемещения данных объекта в поля формы и наоборот. В Symfony 5.2 улучшили это, чтобы использовать функции обратного вызова для получения/установки полей формы. Вам нужно только определить новые параметры геттера или сеттера (или оба), и Symfony выполнит этот обратный вызов, чтобы получить/установить значение из/в объект/массив:

// src/Form/Type/ProductType.php
namespace App\Form\Type;

use App\Entity\Person;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;

class PersonType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', TextType::class, [
                'getter' => function (Person $person, FormInterface $form): string {
                    return $person->getUserData()->getFirstName();
                },
                'setter' => function (Person &$person, ?string $name, FormInterface $form): void {
                    $person->rename($name);
                },
            ])

            // ...
        ;
    }

    // ...
}

Эта новая функция означает, что вам больше не нужно создавать преобразователь данных для решения этой проблемы. Однако вам все равно необходимо использовать средства отображения данных в определенных ситуациях (когда несколько полей формы сопоставляются одному методу, когда отображение модели зависит от отправленных данных формы и т. д.)