symfony - 让 Symfony 表单使用简单的 GET 名称
问题描述
我正在使用 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" ..>
有什么办法可以改变这个吗?谢谢!
解决方案
当您使用 Symfony 提供的快捷方式ControllerTrait
时,生成的表单的名称将自动从表单类型的块前缀派生而来。
您可以通过覆盖表单类型中的方法来更改基于此类型的所有表单的隐式名称getBlockPrefix()
:
public function getBlockPrefix()
{
return '';
}
或者,您决定仅更改一个特定表单的名称,方法是显式指定其名称,使用控制器 trait 的快捷方法在后台使用的表单工厂,如下所示:
$form = $this->get('form.factory')
->createNamedBuilder('', AdvancedSearchType::class, null, [
'csrf_protection' => false,
])
->getForm();
但是你现在需要小心。如果在同一个请求期间处理了多个没有名称的表单,则组件无法确定这些表单中的哪一个已提交,并且会像两者都已提交一样行事。
推荐阅读
- c# - 递归获取类的字段和属性类型
- sql - impala 中的长度小于 8 位数
- python - 要求用户输入他们的用户名和密码并将其存储在文件中,如何添加包含哈希密码的字典?
- c# - 更新面板中的 C# 动态单选按钮在第一次单击时未触发?
- javascript - 如何在javascript中的字符串中添加反斜杠?
- python - 如何在 Theano 中更新扫描 Cython 代码?
- sql - sql:按不同部分计算多少个um_no并按小时累计
- jquery - 如何防止在 jQuery 日期范围选择器中重置日期范围?
- c++ - graphics.h 库进程返回 -1073741819 (0xC0000005)
- java - 检查字符串为空或空 - 逻辑