2013-10-11 3 views
0

Я использую JMSDiExtraBundle в своем проекте Symfony2.Symfony2 JMSDiExtraBundle ошибка зависимостей дочерних служб

Вот моя проблема:

Repository.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 необходимо 3 зависимости: DocumentManager, DocumentManager (снова) и Uploader, что вне курса дает ошибку, так как я явно заявил, что второй параметр должен быть Uploader пример.

Вот от 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')); 
} 

Является ли это намеренное поведение? Или может быть ошибка? Или я сделал что-то не так?

Нужен совет!

+1

Почему вы добавляете инъекцию в абстрактный класс? Просто удалите часть @InjectParams в своем абстрактном родительском классе, так как она абстрактна, вы не можете ее создать. – m0c

+0

Похоже на ошибку, может быть, вам стоит сообщить об этом? –

+0

@ m0c - это очень хороший момент, хотя на самом деле он не вызывает моего любопытства по поводу поведения. Но ваш ответ спас день :) –

ответ

2

Вы можете просто удалить @InjectParams в своем абстрактном родительском классе, так как он никогда не создается в любом случае. Тогда только то, что вам нужно, вводят в ваш реальный сервис.