Symfony2 并避免过于冗长的代码


Symfony2 and avoiding overly verbose code

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

/** @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,因为它是该版本中标准发行版的一部分。