我已经完成了一个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 :) 非常感谢。
答案 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));