Symfony FormType getParent vs Inheritance

时间:2014-04-04 11:04:41

标签: symfony symfony-forms

在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';
    }
}

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

谢谢!

2 个答案:

答案 0 :(得分:7)

主要有两点不同:

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

  • 第二个区别是使用buildFormbuildView修改子表单中父表单的行为。
    使用第一种方法(例如继承),覆盖基类的方法(如果您在子级中提供它们),但第二种方法(例如 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

      表单字段:[电子邮件]

答案 1 :(得分:0)

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

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