2

我已经按照这里的文档创建了一个 RabbitMQ 消费者,但是,我需要能够EntityManager在我的消费者中使用 Doctrine,我不知道如何做到这一点。

因为它是一个命令,所以我尝试扩展ConainerAwareCommand,但是消费者的执行方法签名与这种类型不兼容。我发现没有明显的方法来覆盖构造函数和/或调用设置器无济于事,即使我将它创建为服务。

有没有其他人有任何经验如何做到这一点?

编辑:

我已经尝试将其创建为服务,并具有以下 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。是否有可能为容器实例化了一次类,​​但传递给命令的实例没有通过服务容器实例化?

4

2 回答 2

2

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


因为我太酷了,下面是一个emailConsumer我们同时注入邮件程序和实体管理器的示例:

如果你使用 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
    }
}
于 2013-04-30T01:00:19.793 回答
0

在消费者中使用 Doctrine 时,您是否遇到过“没有活动交易”异常?我有一个作为后台进程运行的消费者,几个小时后,我收到了这个错误消息。因此我必须手动重新启动消费者。

于 2013-08-05T16:08:50.250 回答