Symfony FormType getParent与继承

标签 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';
    }
}

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

谢谢!

最佳答案

有两个主要区别:

  • 第一个关于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/

    相关文章:

    php - 使用 knpmenu bundle 在 symfony 2.1 中创建面包屑

    php - Symfony2 错误提交实体类型的表单(多对多关系)

    javascript - 如何在 Symfony 上显示日期选择器?

    symfony - 使用 choice_list 在 symfony2 选择表单类型上使用自定义值

    forms - 使用选项卡以表格形式编辑 Symfony2 大实体

    symfony - 可捕获的 fatal error : Object of class could not be converted to string

    symfony2 : cannot redeclare class

    symfony - 原则 CASE WHEN THEN ELSE NULL

    sql - Doctrine DQL 每组最大 n

    php - Symfony2 将变量从自己的包传递到 Twig