我遇到了两种将依赖项注入自定义原则存储库的方法。
- https://juriansluiman.nl/article/142/dependency-injection-in-a-doctrine-repository
- http://blog.tomhanderson.com/2016/01/dependency-injection-in-doctrine.html
我理解方法一,因为它不再使用实体管理器来检索存储库,而是使用服务管理器。
但是,我不明白方法二。 有两部分我不明白。 第一个是"配置"部分。 教义配置键"repository_factory"有什么作用?
return array(
'doctrine' => array(
'configuration' => array(
'orm_default' => array(
'repository_factory' => 'DbRepositoryRepositoryFactory',
),
),
),
'service_manager' => array(
'invokables' => array(
'DbRepositoryRepositoryFactory' => 'DbRepositoryRepositoryFactory',
),
),
);
其次,我不确定如何检索存储库。 我是否仍应使用实体管理器? 还是应该像在方法一中那样使用服务管理器?
据我了解,第二个链接提供了一种在实例化存储库时覆盖传递给存储库的默认参数的方法。
工厂的主要作用(不仅在Symfony中,它是一种常见的设计模式)是创建一个或多个类的实例,而不是通过new
关键字自行实例化它们。
当你调用$em->getRepository('EntityFQCN')
时,Doctrine(通过repository_factory
)会寻找在你的实体中定义的最终存储库类(即 @ORMRepositoryClass(...)
) 并返回它的实例,否则,如果没有找到该实体的存储库类,它将返回默认 EntityRepository 的实例,并将指定的实体作为参数(即 getRepository('EntityFQCN')
)。
因此,在不详细查看链接的情况下,我想我可以说,如果您尝试实现此替代方案,您将通过"默认"方式检索您的存储库,即 EntityManager::getRepository('xxxx')
.
此配置部分的作用是以不同于默认的方式实例化存储库。
当我需要覆盖默认EntityRepository
时,我已经覆盖了 RepositoryFactory(返回自定义存储库类的实例而不在我的实体中定义它,换句话说,替换默认的存储库类)。你可以看到它在行动。
希望你在教义中对 DI 有很多乐趣。