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

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

谢谢!

最佳答案

有两个主要区别:

  • 第一个关于FormTypeExtension。这些扩展名会修改某些表单类型(例如:它们可以更改/添加一些默认选项,甚至添加字段)。
    使用第一种方法(例如继承),所有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

    表单字段:[名称] [电子邮件]
  • 关于Symfony FormType getParent与继承,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22861044/

    10-09 18:24