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

时间:2015-12-07 10:23:52

标签: symfony-forms symfony symfony-2.8

假设我将自定义表单类型创建为服务,如Symfony documentation中所述。但我想要2个“性别”自定义类型,有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

然后,我宣布了两个这样的服务:

<!-- 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>

正如您所看到的,我使用相同的 GenderType类用于2种自定义表单类型(包含gender1gender2别名)可以这样使用:

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

这允许我在一个具有不同输入参数的类(GenderType)中添加一些通用逻辑(在这个例子中,我有比2更多的可能性)。

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

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

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

创建Gender1TypeGender2Type扩展抽象GenderType类会非常痛苦,因为我必须创建大量具有空内容的类。

你是否知道如何在Symfony 2.8中实现我的模式,保持服务使用不同的输入参数,但不创建很多类?

1 个答案:

答案 0 :(得分:3)

好了,在将这个话题再挖掘一下之后,someone already asked直接在Symfony 2.8中的PR concerning this change中提出问题。

答案是我正在做的模式不再可能,所以我看到了解决问题的两种方法:

  • 创建与我的自定义类型服务一样多的类,而不是一直使用同一个类,并使这些类扩展为抽象类(在我的示例中:create Gender1TypeGender2Type扩展AbstractGenderType抽象类的类
  • 只保留一个类,但为其添加选项以传递我的特定参数。