С точки зрения здравого смысла этого не должно было случиться. Однако, если вы посмотрите на сгенерированную разметку (перед отправкой), вы, вероятно, увидите, что ваша форма имеет имя form
, а ваши поля - form[Comment]
, form[Type]
и т. Д. Обратите внимание, что поле обеих форм будет иметь form
префикс.
Конфликт имен - это то, что заставляет Symfony
думать, что вы собираетесь отправить обе формы. У вас есть два способа решения этой проблемы:
1. Сделайте так, чтобы ваши формы отправлялись по другому URL-адресу и по окончании перенаправляли на общий.
Это включает добавление вызова setAction
для обоих ваших конструкторов форм. В некоторых случаях это может быть именно тем, что вы хотите, но если ваш общий код (тот, который идет после отправки) полагается на большую часть материала, который вышел в форме, это просто боль. Например:
$formbuilder = $this->get('form.factory')
->createBuilder(FormType::class, $wishcom);
$formbuilder
->add('Type', ChoiceType::class, array(
'choices' => array(
'Argument' => 'Argument',
'Contre-argument' => 'Contre-argument',
'Commentaire' => 'Commentaire')
)
)
->add('Comment', TextareaType::class)
->add('Commenter', SubmitType::class)
->setAction('/formcom-submit') // <-- THIS
$formcom=$formbuilder->getForm();
2. Создайте построитель форм named
.
Это IMO более естественный способ обработки столкновения именования форм. Каждая из форм будет иметь свое собственное имя, поэтому при вызове handleRequest
будет обработана только одна из форм. Например:
$formbuilder = $this->get('form.factory')
->createNamedBuilder('formcom', FormType::class, $wishcom);
и
$formbuilder = $this->get('form.factory')
->createNameBuilder('formsol', FormType::class, $wishsol);
Еще одна вещь, которую стоит изучить, стоит ли переносить обе формы в отдельные классы. В этом случае вы получите уникальность имени из коробки, и ваш код наверняка будет чувствовать себя чище. В любом случае, если вы собираетесь повторно использовать эту форму в другом действии, я бы сказал, пойти на это.
Надеюсь, это поможет ...