2013-04-29 66 views
2

我遵循文档here创建了RabbitMQ使用者,但是,我需要能够在我的使用者中使用Doctrine EntityManager,并且我对如何处理这个。如何将EntityManager注入到RabbitMQBundle使用者

因为它是一个命令,我试图扩展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); 
    } 
} 

当I var_dump()在构造函数中我可以看到该对象被正确实例化,但是当我在执行方法中使用var_dump()时,entityManage r属性为NULL。这个类是否有可能为容器实例化一次,但传递给该命令的实例没有通过服务容器实例化?

回答

2

您需要注入的服务名称是doctrine.orm.entity_manager


因为我是SOOO酷,这里是一个emailConsumer我们注入既是邮件和EntityManager的一个例子:

如果使用阳明:

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 
    } 
} 
+0

请参阅我对我的进一步阐述问题 - 我曾尝试将此创建为服务,但EntityManager似乎从未正确指定。 – frak 2013-04-30 12:30:13

+0

您的代码中存在拼写错误,它是您的属性中的$ entityManager,而不是$ entityMagager。 var_dump()中的同样错误:) – Mick 2013-04-30 14:07:41

+0

嗯,我很高兴至少有一个人可以阅读; o)谢谢! – frak 2013-04-30 14:45:02

0

你曾经encouter“没有活跃交易”在消费者使用时学说例外?我有一个作为后台进程运行的消费者,几个小时后,我收到了这条错误消息。因此我必须手动重新启动消费者。

相关问题