【问题标题】:Symfony2 and avoiding overly verbose codeSymfony2 和避免过于冗长的代码
【发布时间】:2013-11-05 19:24:11
【问题描述】:

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

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

这是好的做法吗?还是违反了某种标准?它是否使代码“松散耦合”更少?

【问题讨论】:

  • 哪一部分不可能?我所有的控制器都已经继承自我创建的公共 BaseController(扩展 Symfony\Bundle\FrameworkBundle\Controller\Controller
  • 只是为了给你一个提示——如果你将 PHPStorm 与 Symfony2 插件一起使用,你可以节省大量用于类型提示的注释。在这里您可以找到插件的预告片:plugins.jetbrains.com/plugin/7219

标签: php symfony loose-coupling


【解决方案1】:

这个怎么样?

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

【讨论】:

  • 简单而有效。我想唯一的缺点是缺乏(自动)IDE代码完成等。
【解决方案2】:

我建议使用Model Manager 方法。然后,您可以反过来使用JMSDiExtraBundle 使实例化更加容易。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多