mpiot
mpiot

Reputation: 1522

Inject EntityManager in an EventSubscriberInterface

I've done an EventSubscriber, but I need to use EntityManager in. I've filled the services.yml like this:

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

I try to use it in the EventSubscriber like this:

class TubeDynamicFieldSubscriber implements EventSubscriberInterface
{
    private $em;

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

    ...
}

Finally I use the EventSubscriber in a FormType like this:

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);
    }

...
}

But I've an error:

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

I've try to use it: $builder->addEventSubscriber(new TubeDynamicFieldSuscriber()) but I've again an error: it don't recover the EntityManager.

If you know how I can inject the EntityManager in the EventSubscriber :) Thanks a lot.

Upvotes: 1

Views: 618

Answers (1)

Gerry
Gerry

Reputation: 6012

While your code snippets are not very clear, if your form type has dependencies, it needs to be registered in the service container so that Symfony (and the form factory) know how to construct it.

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

However, a better way of doing this is probably to inject the entity manager in the form type:

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

That way, in your code, you can just do:

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

Upvotes: 3

Related Questions