Symfony2和控制器中的DRY方法

时间:2012-03-13 23:00:00

标签: design-patterns symfony dry

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

但是(是的,有一个“但是”)我感觉我正在做同样的事情,复制并粘贴所有控制器。我们讨厌的代码重复。将所有业务逻辑移至Services以及Doctrine中的表单,事件和持久操作,我的所有控制器都执行相同的操作:

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

我的意思是控制器操作完全相同,只需更改几个字符。

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

编辑:相关问题(针对Boo建议的第一个想法):Symfony2 how to redirect to an action without hardcoding route name?

1 个答案:

答案 0 :(得分:2)

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

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

    我发现想法1非常优雅,而3也有一些优势。第二种方法是一种愚蠢的行为,特别是当你再次需要公开的代码时(即使它会少得多,它远非最优)。创意1与OO理念同步,并且很好地传达了它的意图。总结一下,我会使用BaseController!