自定义Doctrine存储库的依赖注入

时间:2016-04-22 14:56:50

标签: php doctrine-orm dependency-injection repository

我遇到了两种将依赖项注入自定义Doctrine存储库的方法。

  1. https://juriansluiman.nl/article/142/dependency-injection-in-a-doctrine-repository
  2. http://blog.tomhanderson.com/2016/01/dependency-injection-in-doctrine.html
  3. 我理解方法一,因为它不再使用实体管理器来检索存储库而是使用服务管理器。

    但是,我不明白方法二。有两部分我不明白。第一个是“配置”部分。 Doctrine配置键“repository_factory”有什么作用?

    return array(
        'doctrine' => array(
            'configuration' => array(
                'orm_default' => array(
                    'repository_factory' => 'Db\Repository\RepositoryFactory',
                ),
            ),
        ),
    
        'service_manager' => array(
            'invokables' => array(
                'Db\Repository\RepositoryFactory' => 'Db\Repository\RepositoryFactory',
            ),
        ),
    );
    

    然后第二,我不知道如何检索存储库。我还是应该使用实体经理吗?或者我应该像在方法一中那样使用服务管理器吗?

1 个答案:

答案 0 :(得分:1)

据我了解,第二个链接提供了一种方法来覆盖在实例化时传递给存储库的默认参数。

工厂的主要角色(不仅在Symfony,它是一个常见的design pattern)是创建一个或多个类的实例,而不是通过new自己实例化它们。关键字。

当您调用$em->getRepository('EntityFQCN')时,Doctrine(通过repository_factory)查找您的实体中定义的最终Repository类(即@ORM\RepositoryClass(...))并返回它的实例,否则,如果没有为实体找到Repository类,它返回默认EntityRepository的实例,指定的实体作为参数(即getRepository('EntityFQCN'))。

所以,如果不仔细查看链接,我想我可以说,如果你尝试实现这个替代方案,你将通过"默认"来检索你的存储库。方式,即EntityManager::getRepository('xxxx') 此配置部分的作用是以不同于默认存储库的方式实例化存储库。

当我需要覆盖默认的EntityRepository时,我已经重写了RepositoryFactory(返回自定义Repository类的实例而不在我的实体中定义它,换句话说,替换默认的Repository类)。 你可以see it in action

希望你在Doctrine中有很多乐趣。