【问题标题】:Symfony2 and be DRY approach in controllersSymfony2 和控制器中的 DRY 方法
【发布时间】:2012-03-13 23:00:00
【问题描述】:

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

但是(是的,有一个“但是”)我觉得我在做同样的事情,复制并粘贴到所有控制器中。我们讨厌的代码重复。将所有业务逻辑移至 Services 并在 Doctrine 中保存表单、事件、持久化操作,我所有的控制器都在做同样的事情:

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

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

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

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

【问题讨论】:

    标签: design-patterns symfony dry


    【解决方案1】:

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

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

    我猜想的时候还有更多的方法。

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

    【讨论】:

    • 您认为第 1 点是一种策略模式吗?我的意思是检索 - 验证 - 持久化?
    • 我遵循了你的第一个想法。没那么简单,看我的相关问题:stackoverflow.com/questions/9719686/…
    猜你喜欢
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多