在我的大多数控制器中,我需要获取对一个或多个自定义实体存储库的引用,因此自然而然地,我经常这样做:
/** @var $repo MyFirstEntityRepository */
$repo1 = $this->getDoctrine()->getManager()->getRepository('MyNamespaceMyBundle:MyFirstEntity');
/** @var $repo MySecondEntityRepository */
$repo2 = $this->getDoctrine()->getManager()->getRepository('MyNamespaceMyBundle:MySecondEntity');
/** @var $repo MyThirdEntityRepository */
$repo3 = $this->getDoctrine()->getManager()->getRepository('MyNamespaceMyBundle:MyThirdEntity');
我的问题是:如果我有一堆不同的实体需要存储库参考,那么在所有其他控制器都可以继承的某种BaseController
中创建一堆相应的get[EntityName]Repository
方法是否是一种好的做法?
重构的控制器代码更像:
$repo1 = $this->getMyFirstEntityRepository();
$repo2 = $this->getMySecondEntityRepository();
$repo3 = $this->getMyThirdEntityRepository();
这也与 IDE 自动完成和类型推断配合得很好。
这是好的做法吗?还是违反了某种标准?它是否使代码不那么"松散耦合"?
这个怎么样?
$em = $this->getDoctrine()->getManager();
/** @var $repo MyFirstEntityRepository */
$repo1 = $em->getRepository('MyNamespaceMyBundle:MyFirstEntity');
/** @var $repo MySecondEntityRepository */
$repo2 = $em->getRepository('MyNamespaceMyBundle:MySecondEntity');
/** @var $repo MyThirdEntityRepository */
$repo3 = $em->getRepository('MyNamespaceMyBundle:MyThirdEntity');
在我看来,声明变量$em
解决了所有 DRY 违规行为......
我建议使用模型管理器方法。 然后,您可以反过来使用 JMSDiExtraBundle 使实例化更加容易。
注意:如果你使用的是Symfony 2.2,那么你可能已经安装了JMSDiExtraBundle,因为它是该版本中标准发行版的一部分。