【问题标题】:How to inject EntityManager into a RabbitMQBundle consumer如何将 EntityManager 注入 RabbitMQBundle 消费者
【发布时间】:2013-04-29 20:56:57
【问题描述】:

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

【问题讨论】:

    标签: php symfony rabbitmq


    【解决方案1】:

    您需要注入的服务名称是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
        }
    }
    

    【讨论】:

    • 请参阅我对我的进一步阐述问题 - 我已尝试将其创建为服务,但 EntityManager 似乎从未正确分配。
    • 您的代码中有错字,它是您属性中的 $entityManager,而不是 $entityMagager。 var_dump() 中也有同样的错误:)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-10-20
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多