2

ここのドキュメントに従ってRabbitMQコンシューマーを作成しましたが、コンシューマーでDoctrineを使用できるようにする必要があり、EntityManagerこれを行う方法について途方に暮れています。

コマンドなので拡張してみましConainerAwareCommandたが、consumer の execute メソッドのシグネチャはこの型と互換性がありません。サービスとして作成したとしても、コンストラクターをオーバーライドしたり、セッターを呼び出したりする明確な方法が見つかりませんでした。

他の誰かがこれを行う方法について経験がありますか?

編集:

私はすでにこれをサービスとして作成しようとしましたが、次の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()、execute メソッドでは、entityManager プロパティが NULL です。クラスがコンテナーに対して 1 回インスタンス化されている可能性はありますが、コマンドに渡されるインスタンスはサービス コンテナーを介してインスタンス化されていませんか?

4

2 に答える 2