将存储库注入Factory Symfony2

时间:2015-04-16 10:52:32

标签: php symfony repository

我正在学习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看错了什么..?

3 个答案:

答案 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'

如果您的所有服务需求都是存储库,那么注入存储库比注入整个实体管理器更清晰。至少在我不那么谦虚的意见中。