Иногда объекты, обрабатываемые с помощью форм 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);
},
])
// ...
;
}
// ...
}
Эта новая функция означает, что вам больше не нужно создавать преобразователь данных для решения этой проблемы. Однако вам все равно необходимо использовать средства отображения данных в определенных ситуациях (когда несколько полей формы сопоставляются одному методу, когда отображение модели зависит от отправленных данных формы и т. д.)