我已经按照文档here创建了一个RabbitMQ使用者,但是,我需要能够在我的消费者中使用Doctrine EntityManager
,而我却不知道如何做此
由于它是一个命令,我试图扩展ConainerAwareCommand
但是,消费者的执行方法签名与此类型不兼容。我发现没有明显的方法来覆盖构造函数和/或调用setter无效,即使我将其创建为服务。
有没有其他人有过如何做到这一点的经验?
编辑:
我已经尝试将其创建为服务,并具有以下services.yml:
import.video:
class: Acme\DemoBundle\Service\Consumer\ImportVideoConsumer
arguments:
entityManager: @doctrine.orm.entity_manager
消费者看起来像这样:
class ImportVideoConsumer implements ConsumerInterface
{
/**
* @var EntityManager
*/
private $entityMagager;
/**
* @param EntityManager $entityManager
*/
public function __construct(EntityManager $entityManager)
{
$this->entityManager = $entityManager;
var_dump($entityManager);
}
/**
* Process the message
*
* @param AMQPMessage $msg
*/
public function execute(AMQPMessage $msg)
{
$body = json_decode($msg->body);
var_dump($this->entityMagager);
}
}
当我在构造函数中var_dump()
时,我可以看到对象被正确实例化,但是当执行方法中的var_dump()
时,entityManager属性为NULL。是否可能为容器实例化一次类,但传递给命令的实例不是通过服务容器实例化的?
答案 0 :(得分:2)
您需要注入的服务名称为doctrine.orm.entity_manager
。
因为我很酷,这里是一个emailConsumer
的例子,我们注入了邮件程序和entityManager:
如果您使用YML:
services:
acme_demo.consumer.email:
class: Acme\DemoBundle\Consumer\EmailConsumer
arguments:
mailer: "@mailer"
entityManager: "@doctrine.orm.entity_manager"
如果您使用XML:
<service id="acme_demo.consumer.email" class="Acme\DemoBundle\Consumer\EmailConsumer">
<argument type="service" id="mailer" />
<argument type="service" id="doctrine.orm.entity_manager" />
</service>
在您的消费者中:
class EmailConsumer implements ConsumerInterface
{
/**
* @var \Swift_Mailer
*/
private $mailer;
/**
* @var EntityManager $entityManager
*/
private $em;
public function __construct(\Swift_Mailer $mailer, $entityManager){
$this->mailer = $mailer;
$this->em = $entityManager;
}
public function execute(AMQPMessage $msg)
{
//Your logic here
}
}
答案 1 :(得分:0)
您是否曾在消费者中使用Doctrine时遇到“没有活动交易”的例外情况?我有一个作为后台进程运行的消费者,几个小时后,我收到了此错误消息。因此,我必须手动重新启动消费者。