Symfony 5:在一个控制器中处理多个表单
我试图使用以下功能在Symfony 5的同一页面中管理多个表单,但似乎每次我尝试提交表单时,仅处理列表的第一个表单,即使它不是已提交的表单:Symfony 5:在一个控制器中处理多个表单,symfony,Symfony,我试图使用以下功能在Symfony 5的同一页面中管理多个表单,但似乎每次我尝试提交表单时,仅处理列表的第一个表单,即使它不是已提交的表单: class ContentController extends AbstractController { /** * @Route("/category/edition/{content}", name="edit_category") */ public function edi
class ContentController extends AbstractController
{
/**
* @Route("/category/edition/{content}", name="edit_category")
*/
public function edition(Request $request, Category $content): Response
{
$forms = [
"edit_category" => $this->createForm(EditCategoryType::class, $content),
"create_post" => $this->createForm(CreatePostType::class)
];
foreach($forms as $form) {
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
// Always prints edit_category
// even when that is the the create_post that is submitted
return var_dump($form->getName());
}
}
return $this->render(
'content/edition.html.twig',
[
'forms' => \array_map(
function($form) {
return $form->createView();
},
$forms
),
'content' => $content,
]
);
}
}
我在其他帖子中看到表单的名称有时会引起问题,但我检查了表单是否有不同的名称,并且我还尝试在单独的foreach
循环中调用每个表单上的handleRequest()
,因为我在一些帖子中看到了这一点,但是(我必须说,这是意料之中的)没有改变行为
在Symfony的同一个控制器中如何处理多个表单,我似乎没有找到任何一致的最佳实践技巧,因此我想知道最好的方法是什么,或者为每个表单定义一个单独的操作路径以完全避免这个问题是否会更干净
如果需要,content/edition.html.twig
文件如下所示:
{% set edit_category_form = forms['edit_category'] %}
{% set create_post_form = forms['create_post'] %}
{{ form_start(edit_category_form) }}
{{ form_errors(edit_category_form) }}
{{ form_end(edit_category_form) }}
{{ form_start(create_post_form) }}
{{ form_errors(create_post_form) }}
{{ form_end(create_post_form) }}
(
Category
是一个经典的Symfony实体,EditCategoryType
是一个与Category
实体相关联的表单,CreatePostType
是一个与另一个Symfony实体相关联的表单)经过一些研究,出于某种原因,它似乎在以下情况下(且仅当?)起作用表单是在处理请求之前生成的:
class ContentController extends AbstractController
{
/**
* @Route("/category/edition/{content}", name="edit_category")
*/
public function edition(Request $request, Category $content): Response
{
$self = $this;
$formBuilders = [
"edit_category" => function() use ($self, $content) {
return $self->createForm(EditCategoryType::class, $content);
},
"create_post" => function() use ($self, $content) {
return $self->createForm(CreatePostType::class);
},
];
$forms = [];
foreach($formBuilders as $key => $formBuilder) {
$form = $formBuilder();
$forms[$key] = $form;
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
// Does print the name of the right form
return var_dump($form->getName());
}
}
return $this->render(
'content/edition.html.twig',
[
'forms' => \array_map(
function($form) {
return $form->createView();
},
$forms
),
'content' => $content,
]
);
}
}
这是可行的,但感觉不是一个正确的处理方法 是否可以编辑您的帖子,使代码成为其他用户可以测试的可运行代码段?我没有包括表单和实体类,因为它们不相关,但现在可能更好。