Symfony FormType getParent vs Inheritance

8 symfony-forms symfony

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

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

我想知道这种方法背后的哲学.

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

class ImageType extends FileType
{
    public function getName()
    {
        return 'image';
    }
}
Run Code Online (Sandbox Code Playgroud)

而不是这个:

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

    public function getName()
    {
        return 'image';
    }
}
Run Code Online (Sandbox Code Playgroud)

如果能,那么这两种方法有什么区别?

谢谢!

use*_*997 7

有两个主要区别:

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

  • 第二个区别是使用buildForm和修改子表单中父表单的行为buildView.
    使用第一种方法(例如继承)将覆盖基类的方法(如果在子级中提供它们),但第二种方法(例如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');
        }
    
    Run Code Online (Sandbox Code Playgroud)

    处理办法:

    • 遗产:

      表格字段:[ 姓名 ] [ 电子邮件 ]

    • 的getParent

      表格字段:[ email ]


Geo*_*rge 0

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

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