不要将扩展表单类型重新声明为服务以传递父参数

时间:2017-02-24 11:33:44

标签: dependency-injection symfony symfony-forms

我创建了一个symfony表单类型,我希望能够使用实体管理器。

所以我将它声明为symfony文档中提到的服务: http://symfony.com/doc/current/form/form_dependencies.html#define-your-form-as-a-service

现在我想创建另一个扩展第一个表单类型的表单类型。 但似乎我需要将这种新的表单类型声明为服务,即使它是从已经声明为服务的第一个扩展的。

是否可以告诉symfony检测新表单是否正在扩展第一个表单类型并自动注入父类的依赖项?

// src/AppBundle/Form/TaskType.php

use Doctrine\ORM\EntityManager;

class TaskType extends AbstractType
{
    private $em;

    public function __construct(EntityManager $em)
    {
        $this->em = $em;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // ...
    }

    // ...
}
// src/AppBundle/Form/TaskObject1Type.php

use Doctrine\ORM\EntityManager;

class TaskObject1Type extends TaskType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        parent::buildForm($builder, $options);

        // ...
    }

    // ...
}

1 个答案:

答案 0 :(得分:0)

您不应通过扩展类来扩展Symfony中的表单类型。 相反,使用getParent方法指向父类型。

所以,改为

class ChildType extends ParentType
{
    ...
}

使用

class ChildType extends AbstractType
{
    ...
    public function getParent()
    {
        return ParentType::class;
    }
}

因此,您需要处理父类依赖项。