我目前正在使用Symfony 4.1的表单生成器创建一个简单的搜索表单。渲染效果很好,但是我对请求的形成方式缺乏控制。
生成的请求如下:
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()
还有
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->setMethod('GET')
->add('query', SearchType::class,
[
'attr'=> [
'placeholder' => 'search.query'
]
]
)
->add('category', EntityType::class,
[
'class' => Category::class,
'label' => 'search.category',
'group_by' => function(Category $category, $key, $value) {
// Code...
return $category->getName();
}
]
)
->add('verifiedOnly', CheckboxType::class,
[
'label' => 'search.verifiedOnly',
'required' => false
]
)
->add('save', SubmitType::class,
[
'label' => 'search.submitButton'
]
);
}
其背后的原因是因为它生成了这样的小部件
<input .. name="advanced_search[query]" ..>
当我想要他们这样
<input .. name="query" ..>
有什么办法可以改变这个?谢谢!
答案 0 :(得分:3)
使用Symfony的ControllerTrait
提供的快捷方式时,生成的表单的名称将自动从表单类型的块前缀中派生。
您可以通过覆盖表单类型中的getBlockPrefix()
方法来更改所有表单的隐式名称:
public function getBlockPrefix()
{
return '';
}
或者您决定通过使用控制器特征的快捷方式在后台使用显式使用的形式工厂来显式地为其命名来更改其名称:
$form = $this->get('form.factory')
->createNamedBuilder('', AdvancedSearchType::class, null, [
'csrf_protection' => false,
])
->getForm();
但是您现在需要小心。如果在同一请求中有多个不带名称的表格,则该组件将无法决定已提交其中的哪一个表格。