我正在学习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看错了什么..?
答案 0 :(得分:0)
repository.postcode
不作为服务存在。
一般来说,这样做有点棘手,因为Repos来自EntityManager
我通常更喜欢注入EM,然后请求它进行回购
答案 1 :(得分:0)
您需要先将存储库注册为服务,然后才能将其注入其他服务。
<service id="repository.postcode"
class="Test\Bundle\Repository\Postcode">
<factory service="doctrine.orm.entity_manager" method="getRepository" />
<argument>Test\Bundle\Entity\Postcode</argument>
</service>
答案 2 :(得分:0)
糟糕。看起来@Gerry打败了我。他使用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'
如果您的所有服务需求都是存储库,那么注入存储库比注入整个实体管理器更清晰。至少在我不那么谦虚的意见中。