Symfony2和控制器中的DRY方法

gre*_*emo 5 design-patterns dry symfony

我正在使用Symfony2为我的公司开发一个小型CMS.我真的很喜欢这个框架.我喜欢表单类并重用它们(毕竟这些都是关于表单的).

但是(是的,有一个"但是")我感觉我正在做同样的事情,复制并粘贴在所有控制器中.我们讨厌的代码重复.随着所有业务逻辑转移到服务和表单,事件,Doctrine中的持久化操作,我的所有控制器都做同样的事情:

  • 获取存储库 $this->get('mycompany.repository.entity')
  • 动态创建表单(逻辑在表单类本身内)
  • 验证表单,返回视图或持久保存实体
  • 等等...

我的意思是控制器动作都是一样的,只是几个字符的变化.

如何在我的控制器中使用Symfony2 进行DRY?也许控制器作为服务(我几天前才发现的一个概念)可能有所帮助?

编辑:相关问题(Boo建议的第一个想法):Symfony2如何重定向到没有硬编码路由名称的操作?

Sgo*_*kes 2

有很多方法可以获得更 DRY 的代码库:

  1. 您可以创建一个抽象的 BaseController。它可以将重复的代码分组到一些私有方法中,因此扩展它的每个控制器都可以使用它。使用私有属性,您可以在调用方法之前设置特定于控制器的内容。
  2. 您可以实现一些 BaseService,这样您只需要调用该服务,设置一些参数(例如要使用哪个存储库),然后让该服务执行逻辑
  3. 您可以只有一个控制器,它接受一些参数并定义每条路由以使用该控制器,并传递特定参数。

我想,仔细想想,还有更多的方法。

我发现想法 1 非常优雅,而想法 3 也有一些优点。第二种方法有点模糊,特别是当您再次需要重复的代码时(即使它会少得多,但它远非最佳)。想法 1 与 OO 想法同步,并且很好地传达了其意图。总而言之,我会使用 BaseController!