我有一个服务类,它依赖于多个实体存储库,例如4.
我可以注入每个存储库并最终得到许多依赖项,或者我可以将实体管理器作为单个依赖项注入;依靠EntityManager->getRepo('xyz')
。
单独的依赖项具有代码提示的好处。
单一依赖意味着构造的冗长 可能更容易嘲笑和减少设置?
什么是更好的做法?
答案 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()...
}
}