Php symfony4-Twig-Forms-使用GET方法发送表单在URL中添加括号,并将submit按钮作为参数

Php symfony4-Twig-Forms-使用GET方法发送表单在URL中添加括号,并将submit按钮作为参数,php,symfony,twig,Php,Symfony,Twig,使用Symfony 4的GET方法发送表单时,我遇到两个问题。此表单包含筛选器,提交此表单将根据所选筛选器更新显示项目的列表 表单是这样构建的: /action?my_form[first_filter]=...&my_form[second_filter]=... 类MyForm扩展了AbstractType{ ... 公共函数buildForm(…){ $builder ->setMethod(“GET”) ->加( “第一个过滤器”, ChoiceType::class, ..

使用Symfony 4的GET方法发送表单时,我遇到两个问题。此表单包含筛选器,提交此表单将根据所选筛选器更新显示项目的列表

表单是这样构建的:

/action?my_form[first_filter]=...&my_form[second_filter]=...

类MyForm扩展了AbstractType{
...
公共函数buildForm(…){
$builder
->setMethod(“GET”)
->加(
“第一个过滤器”,
ChoiceType::class,
...
)
->加(
“第二个过滤器”,
EntityType::类,
...
)
->加(
“按钮应用”,
SubmitType::类
);
第一个问题,发送表单后,URL如下所示:

/action?my_form[first_filter]=...&my_form[second_filter]=...
表单名包含在每个字段名之前是否正常,以及为什么URL不能简单地为:

/action?first_filter=...&second_filter=...
第二个问题是提交按钮是URL中可见的参数的一部分:

/action?my_form[button_apply]=&...
据我所知,提交按钮本身不应该是一个参数


提前感谢

这是正常的行为,可以避免,但它需要调用
createNamed
,而不是在表单工厂上调用
create
(请参见)

或者你不注射它,然后按照特征做:

$form = $this->container->get('form.factory')->createNamed(
      // parameters same as before
);
为了让按钮从GET/POST中消失,我建议您将按钮从表单中删除,并将其添加到模板中(这也增加了可重用性)

{{form_start(form)}
{{form_widget(form)}
{{‘你的标签’| trans}}
{{form_end(form)}}

这使得按钮提交表单,但由于它没有名称和值,因此不会添加到数据中(与
SubmitType
按钮表单类型相反).

欢迎来到Symfony表单组件的奇妙世界。是的,表单名称始终是发布的。这是为了允许处理嵌套表单。是的,提交按钮被认为是html输入元素,因为一个表单可能有多个提交按钮。隐藏所有这些丑陋是使用POST的原因之一。您可以通过使用POST解决这个问题,收集发布的信息,然后重定向到GET url。非常感谢您的完整解释!我想我会保留GET,我唯一想确定的是它是“正常的”行为,它不会发生,因为我构建和发送表单的方式有问题。不完全正确,@Cerad,这是默认行为。有关如何更改两者的详细信息,请参阅我的答案;o)
{{ form_start(form) }}
{{ form_widget(form) }}
<button type="submit">{{ 'your label'|trans }}</button>
{{ form_end(form) }}