使Symfony表单使用简单的GET名称

使Symfony表单使用简单的GET名称,symfony,symfony-forms,Symfony,Symfony Forms,我现在正在使用Symfony 4.1的form builder创建一个简单的搜索表单。渲染效果很好,但我对请求的形成方式缺乏一些控制 生成的请求如下所示: http://localhost:8000/fr/search?advanced_search%5Bquery%5D=test&advanced_search%5Bcategory%5D=1&advanced_search%5BverifiedOnly%5D=&advanced_search%5Bsave%5D= 我希望它看起来像: http

我现在正在使用Symfony 4.1的form builder创建一个简单的搜索表单。渲染效果很好,但我对请求的形成方式缺乏一些控制

生成的请求如下所示:

http://localhost:8000/fr/search?advanced_search%5Bquery%5D=test&advanced_search%5Bcategory%5D=1&advanced_search%5BverifiedOnly%5D=&advanced_search%5Bsave%5D=

我希望它看起来像:

http://localhost:8000/fr/search?query=test&category=1&verifiedOnly=

我正在使用的代码:

$this->ff->create(
                AdvancedSearchType::class,
                null,
                ['csrf_protection' => false]
            )->createView()

这背后的原因是因为它生成这样的小部件

<input .. name="advanced_search[query]" ..>
<input .. name="query" ..>

当我想要这样的时候

<input .. name="advanced_search[query]" ..>
<input .. name="query" ..>


有没有办法改变这一点?谢谢大家!

当您使用Symfony的
ControllerTrait
提供的快捷方式时,生成表单的名称将自动从表单类型的块前缀派生

通过覆盖表单类型中的
getBlockPrefix()
方法,可以更改基于此类型的所有表单的隐式名称:


公共函数getBlockPrefix()
{
返回“”;
}

或者,您决定只更改一个特定窗体的名称,方法是显式地使用controller trait的快捷方式在引擎盖下使用的窗体工厂,如下所示:


$form=$this->get('form.factory')
->createNamedBuilder(“”,AdvancedSearchType::class,null[
“csrf_保护”=>错误,
])
->getForm();


但是你现在需要小心了。如果在同一请求期间有多个表单没有处理名称,组件将无法确定这些表单中的哪一个已经提交,并且将像两个表单都提交一样执行操作。

表单元素名称几乎硬编码到Symfony表单中。没有真正简单的改变方法。只需使用twig创建自己的html表单,然后直接从请求对象中提取数据。另一种方法是发布搜索数据,然后用更漂亮的url重定向。