0

Symfony2 プロジェクトで JMSDiExtraBundle を使用しています。

これが私の問題です:

リポジトリ.php

abstract class Repository extends DocumentRepository implements ReadOnlyRepositoryInterface {
    protected $dm;
    protected $repo;
    protected $query;

   /**
    * @InjectParams({
    *       "dm" = @Inject("doctrine.odm.mongodb.document_manager")
    * })
    */
    public function __construct(DocumentManager $dm) {
        $this->dm = $dm;

        parent::__construct($dm, $this->dm->getUnitOfWork(), new ClassMetadata($this->getDocumentName()));

        $this->query = $this->dm->createQueryBuilder($this->getDocumentName());
    }
}

PostRepository.php

/**
 * @Service("post_repository")
 */
class PostRepository extends Repository implements PostRepositoryInterface {
    private $uploader;

    /**
     * @InjectParams({
     *      "dm" = @Inject("doctrine.odm.mongodb.document_manager"),
     *      "uploader" = @Inject("uploader"),
     * })
     */
    public function __construct(DocumentManager $dm, UploaderService $uploader) {
        parent::__construct($dm);

        $this->uploader = $uploader;
    }
}

ご覧のとおり、PostRepository には 2 つの依存関係が必要です: DocumentManager (後で親としてリポジトリに注入されます) と Uploader。

しかし、Symfony は、PostRepository が DocumentManager、DocumentManager (再び)、および Uploader の 3 つの依存関係を必要としていると仮定して何かを行っているようです。

ここからappDevDebugProjectContainer.xmlです:

<service id="post_repository" class="BusinessLounge\BlogBundle\Repository\PostRepository">
  <argument type="service" id="doctrine_mongodb.odm.default_document_manager"/>
  <argument type="service" id="doctrine_mongodb.odm.default_document_manager"/>
  <argument type="service" id="uploader"/>
</service>

appDevDebugProjectContainer.php:

/**
 * Gets the 'post_repository' service.
 *
 * This service is shared.
 * This method always returns the same instance of the service.
 *
 * @return BusinessLounge\BlogBundle\Repository\PostRepository A BusinessLounge\BlogBundle\Repository\PostRepository instance.
 */
 protected function getPostRepositoryService()
 {
    $a = $this->get('doctrine_mongodb.odm.default_document_manager');

    return $this->services['post_repository'] = new \BusinessLounge\BlogBundle\Repository\PostRepository($a, $a, $this->get('uploader'));
}

これは意図した動作ですか? それともバグでしょうか?それとも私は何か間違ったことをしましたか?

アドバイスが必要です!

4

1 に答える 1

2

とにかくインスタンス化されないため、抽象親クラスの @InjectParams を削除するだけです。次に、必要なものだけが実際のサービスに注入されます。

于 2013-10-13T12:15:41.217 に答える