Я использую 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'));
}
Является ли это намеренное поведение? Или может быть ошибка? Или я сделал что-то не так?
Нужен совет!
Почему вы добавляете инъекцию в абстрактный класс? Просто удалите часть @InjectParams в своем абстрактном родительском классе, так как она абстрактна, вы не можете ее создать. – m0c
Похоже на ошибку, может быть, вам стоит сообщить об этом? –
@ m0c - это очень хороший момент, хотя на самом деле он не вызывает моего любопытства по поводу поведения. Но ваш ответ спас день :) –