Symfony 2.8/3.0升级:如何处理带可变参数的表单类型?

Symfony 2.8/3.0 upgrade: how to deal with form types with variable parameters?

假设我将自定义表单类型创建为服务,如 Symfony documentation 中所述。但是我想要 2 "gender" 自定义类型,有 2 个不同的输入参数,我在 Symfony 2.7 中是这样做的:

# app/config/config.yml
parameters:
    genders1:
        m: Male
        f: Female
    genders2: # This makes no sense at all, but it is for the example purpose!
        h: Horse
        t: Turtle

然后,我声明了 2 个这样的服务:

<!-- src/AppBundle/Resources/config/services.xml -->
<service id="app.form.type.gender1" class="AppBundle\Form\Type\GenderType">
    <argument>%genders1%</argument>
    <tag name="form.type" alias="gender1" />
</service>

<service id="app.form.type.gender2" class="AppBundle\Form\Type\GenderType">
    <argument>%genders2%</argument>
    <tag name="form.type" alias="gender2" />
</service>

如您所见,我对 2 种自定义表单类型(gender1gender2 别名),我可以这样使用:

$builder
    ->add('field1', 'gender1')
    ->add('field2', 'gender2');

这使我可以在具有不同输入参数的 class (GenderType) 中添加一些通用逻辑(在本例中我有比 2 个更多的可能性)。

但是从 Symfony 2.8 开始,不推荐使用服务别名添加字段。 class 名称必须作为第二个参数传递,如下所示:

$builder->add('field1', GenderType::class)

那么我怎样才能区分我的 2 个服务(每个服务都没有相同的输入参数)?

创建 Gender1TypeGender2Type 扩展抽象 GenderType class 会非常痛苦,因为我必须创建很多 classes内容为空。

您是否知道如何在 Symfony 2.8 中实现我的模式,保持服务具有不同的输入参数,但不会创建很多 classes?

好吧,在深入探讨这个话题之后,someone already asked the question directly in the PR concerning this change 在 Symfony 2.8 中。

答案是我之前做的模式不再可行了,所以我看到了 2 个解决问题的方法:

  • 为我的自定义类型创建尽可能多的 classes,而不是一直使用相同的 class,并使这些 classes 扩展一个抽象类型(在我的示例中:创建 Gender1TypeGender2Type class 扩展 AbstractGenderType 摘要 class)
  • 只保留一个 class,但向其添加选项以传递我的特定参数。