Symfony FormType getParent与继承

Symfony FormType getParent与继承,symfony,symfony-forms,Symfony,Symfony Forms,在Symfony中创建自定义字段时,我们定义了一种方法getParent 我们通过扩展AbstractType类来定义类,然后使用getParent方法返回父类型。而不是从父类扩展 我想知道这种方法背后的理念 是否可以将我的自定义类型定义为: class ImageType extends FileType { public function getName() { return 'image'; } } 与此相反: class ImageType ex

在Symfony中创建自定义字段时,我们定义了一种方法getParent

我们通过扩展AbstractType类来定义类,然后使用getParent方法返回父类型。而不是从父类扩展

我想知道这种方法背后的理念

是否可以将我的自定义类型定义为:

class ImageType extends FileType
{
    public function getName()
    {
        return 'image';
    }
}
与此相反:

class ImageType extends AbstractType
{
    public function getParent()
    {
        return 'file';
    }

    public function getName()
    {
        return 'image';
    }
}
如果可以,那么这两种方法的区别是什么


谢谢

否,您需要使用AbstractType进行扩展。它用于显示和构建表单,而不是要扩展的简单实体。基本类型(在您的示例中为FileType)与具有特定方法的文件相关,您可以轻松地覆盖它们,但可以通过AbstractType进行扩展,并可以添加新字段。如果您扩展了文件类型,我认为Symfony2不会正确加载任何新函数


我认为第一种方法更紧凑,并且希望使用它,但我认为如果您正在调整buildView或setDefaultOptions,或者添加不属于基类型的另一种方法,那么这将导致问题。

有两个主要区别:

  • 第一个是关于
    FormTypeExtension
    s的。这些扩展修改某些表单类型(例如:它们可以更改/添加一些默认选项,甚至可以添加字段)。
    使用第一种方法(例如,继承),
    文件类型
    类型的所有扩展都将应用于
    图像类型
    ,但使用第二种方法(例如,getParent),它们不会,因此您可以更好地控制您的结构

  • 第二个区别是使用
    buildForm
    buildView
    在子表单中修改父表单的行为
    使用第一种方法(例如继承),如果您在child中提供基类的方法,则将覆盖它们,但第二种方法(例如getParent)将将子类的逻辑添加到父类的逻辑中

考虑以下示例:

    // FileType
    public function buildForm(FormBuilderInterface $builder, array $options){
        $builder->add('name', 'text');
    }

    // ImageType
    public function buildForm(FormBuilderInterface $builder, array $options){
        $builder->add('email', 'email');
    }
  • 继承: 表单字段:[电子邮件]

  • getParent 表单字段:[名称][电子邮件]


我知道这个问题由来已久,但如果您对该主题感兴趣,请查看。在Symfony2中创建表单继承的“正确”方法是第二种方法。由于他们设计的表单扩展系统的一些限制,他们已经为表单创建了自定义继承系统。我认为他们应该重新设计扩展系统,但这正是我们目前所拥有的。*如果您不知道Symfony2中表单继承系统和表单扩展系统之间的区别,请阅读:不要被Webmozart对问题的描述所迷惑。。。最后,这个问题在没有提出解决方案的情况下解决了。因此,您仍然需要指定
getParent()
方法。