在我的大多数控制器中,我需要获得对一个或多个自定义实体存储库的引用,所以很自然地,我做了很多:
/** @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');
我的问题是:如果我有一堆不同的实体,我需要一个存储库参考,那么在某种get[EntityName]Repository
中创建一堆相应的BaseController
方法是不错的做法其他控制器可以继承?
重构的控制器代码更像是:
$repo1 = $this->getMyFirstEntityRepository();
$repo2 = $this->getMySecondEntityRepository();
$repo3 = $this->getMyThirdEntityRepository();
这也适用于IDE自动完成和类型推断。
这是好习惯吗?还是违反了某种标准?它是否使代码不再“松散耦合”?
答案 0 :(得分:2)
这个怎么样?
$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违规行为......
答案 1 :(得分:1)
我建议使用Model Manager方法。然后,您可以使用JMSDiExtraBundle来更轻松地进行实例化。
注意:如果您使用的是Symfony 2.2,那么您可能已经安装了JMSDiExtraBundle,因为它是该版本标准发行版的一部分。