Представьте пример формы в Symfony:
public function buildForm(FormBuilderInterface $builder)
{
$builder
->add('email', EmailType::class, [
'constraints' =>
new NotBlank(),
new IsUnique(),
],
])
->add('password', PasswordType::class, [
'constraints' =>
new NotBlank(),
new IsStrongEnough(),
],
])
}
Теперь, когда я отправляю форму и проверяю, что она действительна, я бы хотел, чтобы $form->getData()
вернул мой DTO с именем CreateAccountCommand
:
final class CreateAccountCommand
{
private $email;
private $password;
public function __construct(string $email, string $password)
{
$this->email = $email;
$this->password = $password;
}
public function getEmail(): string
{
return $this->email;
}
public function getPassword(): string
{
return $this->password;
}
}
Пример контроллера:
$form = $this->formFactory->create(CreateAccountForm::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->commandBus->dispatch($form->getData());
return new JsonResponse([]);
}
Я не могу использовать этот класс напрямую, используя data_class
, потому что форма, очевидно, ожидает, что модель имеет сеттеры, которые допускают нулевые значения. Сама форма отлично работает, как и проверка.
Я пытался использовать метод Data mapper , но метод mapFormsToData
вызывается до проверки.
Возможно ли это вообще? Или я должен получить данные в виде массива и создать объект вне формы?