在EventSubscriberInterface中注入EntityManager

时间:2016-09-01 13:20:56

标签: symfony

我已经完成了一个EventSubscriber,但我需要使用EntityManager。我已经填充了services.yml,如下所示:

app.subscriber.tube_dynamic_field:
    class: AppBundle\Form\EventListener\TubeDynamicFieldSubscriber
    arguments: ["@doctrine.orm.entity_manager"]

我尝试在EventSubscriber中使用它,如下所示:

class TubeDynamicFieldSubscriber implements EventSubscriberInterface
{
    private $em;

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

    ...
}

最后,我在FormType中使用EventSubscriber,如下所示:

class TubeType extends AbstractType
{
    private $dynamicFieldSubscriber;

    public function __construct(TubeDynamicFieldSubscriber $subscriber)
    {
        $this->dynamicFieldSubscriber = $suscriber;
    }

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
         $builder->addEventSubscriber($this->dynamicFieldSubscriber);
    }

...
}

但我有一个错误:

Type error: Argument 1 passed to AppBundle\Form\TubeType::__construct()
must be an instance of AppBundle\Form\EventListener
\TubeDynamicFieldSubscriber, none given

我尝试使用它:$builder->addEventSubscriber(new TubeDynamicFieldSuscriber())但我又一次出错:它没有恢复EntityManager。

如果您知道如何在EventSubscriber中注入EntityManager :) 非常感谢。

1 个答案:

答案 0 :(得分:2)

虽然您的代码片段不是很清楚,但如果您的表单类型具有依赖关系,则需要在服务容器中注册它,以便Symfony(和表单工厂)知道如何构建它。

services:
    my_form_type:
        class: AppBundle\Form\TubeType
        arguments:  ["@my_event_subscriber"]
        tags: [{ name: form.type }]

但是,更好的方法是将实体管理器注入表单类型:

services:
    my_form_type:
        class: AppBundle\Form\TubeType
        arguments:  ["@doctrine.orm.entity_manager"]
        tags: [{ name: form.type }]

这样,在您的代码中,您可以这样做:

$builder->addEventSubscriber(new TubeDynamicFieldSuscriber($this->manager));