2

在我的大多数控制器中,我需要获取一个或多个自定义实体存储库的引用,所以很自然地,我经常这样做:

/** @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 自动完成和类型推断一起使用。

这是好习惯吗?还是违反了某种标准?它是否使代码变得不那么“松散耦合”?

4

2 回答 2

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 违规问题......

于 2013-11-05T22:02:18.587 回答
1

我建议使用模型管理器方法。然后,您可以反过来使用JMSDiExtraBundle使实例化更加容易。

注意:如果您使用的是 Symfony 2.2,那么您可能已经安装了 JMSDiExtraBundle,因为它是该版本中标准分发的一部分。

于 2013-11-05T20:27:02.730 回答