注入依赖性 - 学说:多个存储库与单个实体管理器

时间:2016-11-14 10:24:07

标签: php database symfony dependency-injection doctrine-orm

我有一个服务类,它依赖于多个实体存储库,例如4.
我可以注入每个存储库并最终得到许多依赖项,或者我可以将实体管理器作为单个依赖项注入;依靠EntityManager->getRepo('xyz')

单独的依赖项具有代码提示的好处。

单一依赖意味着构造的冗长 可能更容易嘲笑和减少设置?

什么是更好的做法?

2 个答案:

答案 0 :(得分:3)

在这种情况下,EntityManager类似于Service Locator。当服务依赖于EntityManager时,它也正式依赖于其所有API和所有相关对象(存储库,元数据等)。更好地注入你真正需要的东西: 显式注入特定存储库使您的服务更易于阅读和测试。

此外,如果可能,更喜欢接口而不是类(ObjectRepository而不是EntityRepository,ObjectManager而不是EntityManager)。

答案 1 :(得分:2)

我假设您必须在服务依赖项中仅使用一个Doctrine Entity Manager。 但是如果你想在你的IDE中使用代码提示,你可以使用像这样的

这样的phpdoc注释
class SomeServiceWithDoctrineDependency
{
    /** @var YourFirstObjectRepository */
    protected $firstRepo;
    /** @var YourSecondObjectRepository */
    protected $secondRepo;
    /** @var YourThirdObjectRepository */
    protected $thirdRepo;

    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->firstRepo = $entityManager->getRepository('First:Repo');
        $this->secondRepo = $entityManager->getRepository('Second:Repo');
        $this->thirdRepo = $entityManager->getRepository('Third:Repo');
    }

    public function getCodeHint()
    {
        // You get hint here for find method
        // $this->thirdRepo()->find()... 
    }
}