首页 > 解决方案 > 让 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" ..>

有什么办法可以改变这个吗?谢谢!

标签: symfonysymfony-forms

解决方案


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

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

public function getBlockPrefix() { return ''; }

或者,您决定仅更改一个特定表单的名称,方法是显式指定其名称,使用控制器 trait 的快捷方法在后台使用的表单工厂,如下所示:

$form = $this->get('form.factory') ->createNamedBuilder('', AdvancedSearchType::class, null, [ 'csrf_protection' => false, ]) ->getForm();

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


推荐阅读