如何将EntityManager注入RabbitMQBundle使用者

时间:2013-04-29 20:56:57

标签: php symfony rabbitmq

我已经按照文档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。是否可能为容器实例化一次类,但传递给命令的实例不是通过服务容器实例化的?

2 个答案:

答案 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时遇到“没有活动交易”的例外情况?我有一个作为后台进程运行的消费者,几个小时后,我收到了此错误消息。因此,我必须手动重新启动消费者。