你应该如何命名MVC架构中的控制器?什么时候应该创建一个新的控制器?

9

我有一个问题,适用于任何MVC框架,我正在使用Zend Framework MVC。

什么情况下应该创建新的控制器?控制器层应该定义什么?

我已经用MVC创建了几个应用程序,并逐渐变得更加可重用,但是我一直很难命名控制器类。大多数情况下,它匹配任何URL请求,因此涉及业务/前端逻辑。但在某些情况下,它似乎完全是任意的。

是否有人有一些启发式/指导方针可以遵循?似乎在所有关于MVC的炒作中,特别是对于PHP,实际约定和启发式数据很少。因为创建无组织的MVC应用程序相当容易...

2个回答

10

我通常为每个逻辑功能组设置一个控制器。这通常与每个模型对应一个控制器,但有时并非如此。

想象一下,您正在创建一个简单的在线目录,该目录显示类别列表,然后当用户选择一个类别时,显示该类别的产品列表,以及用于对类别和产品进行CRUD操作的管理员面板。我会有两个模型(CategoryModelProductModel)。我会有一个控制器来为前端生成类别列表,另一个控制器来生成产品列表(例如,CategoryControllerProductController)。然后我会在后端为类别和产品分别设置一个控制器(AdminCategoryControllerAdminProductController)。这两个后端控制器将处理各自模型的列表/添加/编辑/删除/查看操作。如果您仔细考虑URL结构,并将相关函数放在相关URL上,则您的控制器结构通常会与URL结构匹配。实际上,一些框架(例如CodeIgniter)的默认行为是基于控制器名称路由请求。

至于应该在控制器中放置什么,我认为模型用于数据访问,并包装和隐藏数据库结构。例如,“当状态设置为“完成”时,将当前时间赋值给完成日期”等逻辑非常适合模型。

视图包含您的整个演示文稿。控制器/模型不应生成或处理HTML。决策,例如2列或3列应该在视图中。视图中的逻辑应限于生成可见输出所需的逻辑。如果您发现自己想从视图查询数据库,则可能是将太多逻辑放入视图中。

控制器是干什么的?通常意味着验证输入,将表单数据分配给模型,选择正确的视图并实例化处理请求所需的模型。


谢谢...那基本上就是我正在做的事情。我正在尝试的一件事是将更多的逻辑放入模型层。我使用propel模型对象,并考虑将验证放入模型层。控制器只是在模型中设置数据... - AndreLiem
1
一些开发者喜欢将所有验证放在模型中。我发现表单验证最好在控制器中完成(因为它与UI紧密耦合),而基本数据类型验证(例如将枚举字段限制为某些值)适用于模型。 - Jim OHalloran

1

大多数情况下,我遵循控制器-模型模式。我有一些控制器可能会为多个模型提供服务(例如管理控制器可以为几个管理模型提供服务),但通常的规则是每个业务模型一个控制器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接