Я изучаю концепцию внедрения услуг в рамках Symfony2. Я настроил это. Репозиторий, Фабрика, Контроллер. Я пытаюсь внедрить репозиторий в фабрику, чтобы создать объекты для моего контроллера для обработки.
Я настроил файл services.xml, в котором я пытаюсь объявить свой сервис, и я предполагаю, что именно здесь я ошибаюсь.
Fatal error: Uncaught exception 'Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException' with message 'The service "joint.venture.postcode.factory" has a dependency on a non-existent service
Мой репозиторий:
class Postcode {
private $postcode;
private $paf;
public function setPostcode($postcode)
{
$this->postcode = $postcode;
}
public function getPostcode()
{
return $this->postcode;
}
public function setPaf($paf)
{
$this->paf = $paf;
}
public function getPaf()
{
return $this->paf;
}
}
Моя фабрика
use Test\Bundle\Repository\Postcode;
class PostcodeFactory
{
private $postcode;
public function __construct(
Postcode $postcode
){
$this->postcode = $postcode;
}
public function test()
{
return $this->setPostcode('Hello');
}
}
мои услуги:
<service id="test.postcode.factory"class="Test\Bundle\Factory\PostcodeFactory">
<argument type="service" id="repository.postcode"/>
</service>
Anayone видит что-то не так ..?
repository.postcode
не существует как услуга.
Как правило, это немного сложно сделать, потому что Repos получают от EntityManager
Я обычно предпочитаю вводить EM, а затем просить его для репозиториев
Вам необходимо зарегистрировать свой репозиторий как сервис, прежде чем вы сможете добавить его в другой сервис.
<service id="repository.postcode"class="Test\Bundle\Repository\Postcode">
<factory service="doctrine.orm.entity_manager" method="getRepository" />
<argument>Test\Bundle\Entity\Postcode</argument>
</service>
К сожалению. Похоже, @ Джерри победил меня. И он использует XML. Ну что ж.
Вот пример определения хранилища как службы. Как и с большинством вещей, все сразу, как только вы сделали несколько. Я использую yaml вместо xml, но концепция та же. Я также хотел бы назвать псевдоним менеджера сущностей, но это не обязательно.
cerad_user.entity_manager.doctrine:
alias: doctrine.orm.default_entity_manager
cerad_user.user_repository.doctrine:
class: Cerad\Bundle\UserBundle\Entity\UserRepository
factory_service: 'cerad_user.entity_manager.doctrine'
factory_method: 'getRepository'
arguments:
- 'Cerad\Bundle\UserBundle\Entity\User'
Если все ваши сервисные потребности — это репозиторий, то внедрение репозитория будет чище, чем внедрение всего менеджера сущностей. По крайней мере, по моему не очень скромному мнению.