我正在使用 Symfony2 为我的公司开发一个小型 CMS。我真的很喜欢这个框架。我喜欢表单类并重用它们(毕竟这都是关于表单的)。
但是(是的,有一个“但是”)我感觉我在做同样的事情,复制并粘贴到所有控制器中。我们讨厌的代码重复。随着所有业务逻辑转移到Services http://symfony.com/doc/current/book/service_container.html以及 Doctrine 中的表单、事件、持久操作,我所有的控制器都做同样的事情:
- 获取存储库
$this->get('mycompany.repository.entity')
- 动态创建表单(逻辑位于表单类本身内部)
- 验证表单、返回视图或保留实体
- 等等...
我的意思是控制器的动作都是一样的,只有几个字符发生变化。
怎么会这样DRY我的控制器中是否有 Symfony2?也许控制器即服务(我几天前才发现的一个概念)可能会有所帮助?
EDIT:相关问题(Boo提出的第一个想法):Symfony2如何在不硬编码路由名称的情况下重定向到操作? https://stackoverflow.com/questions/9719686/symfony2-how-to-redirect-to-an-action-without-hardcoding-route-name
有很多方法可以获得更 DRY 的代码库:
- 您可以创建一个抽象的 BaseController。它可以将重复的代码分组到一些私有方法中,因此扩展它的每个控制器都可以使用它。使用私有属性,您可以在调用方法之前设置特定于控制器的内容。
- 您可以实现一些 BaseService,这样您只需要调用该服务,设置一些参数(例如要使用哪个存储库),然后让该服务执行逻辑
- 您可以只有一个控制器,它接受一些参数并定义每条路由以使用该控制器,并传递特定参数。
我想,仔细想想,还有更多的方法。
我发现想法 1 非常优雅,而想法 3 也有一些优点。第二种方法有点模糊,特别是当您再次需要重复的代码时(即使它会少得多,也远非最佳)。想法 1 与 OO 想法同步,并且很好地传达了其意图。总而言之,我会使用 BaseController!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)