Reputation: 1522
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
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