MVC 设计 - 我可以/应该/必须在 CodeIgniter MVC Web 应用程序项目中拥有多少个控制器?

Posted

技术标签:

【中文标题】MVC 设计 - 我可以/应该/必须在 CodeIgniter MVC Web 应用程序项目中拥有多少个控制器?【英文标题】:MVC Design - How many controllers can/should/must I have in a CodeIgniter MVC web app project? 【发布时间】:2011-08-09 19:06:29 【问题描述】:

我正在使用 CodeIgniter MVC 框架在 php 中构建一个相对简单的 Web 应用程序。我以前开发过 PHP 应用程序,但从来没有以严格的方式开发过。我已经习惯了 MVC 框架,但是有两个问题一直让我回到绘图板上,它正在减慢开发速度。

    对于一个 Web 应用程序可以拥有多少个控制器,是否存在最佳实践?我的应用程序有一个(相当大的)控制器,其中包括业务逻辑、表单提交逻辑等。虽然这有效,但我正在争论是否有单独的控制器有意义,例如一个用于表单处理和提交,另一个用于用户管理(会话、登录、注册)等。再说一次,我也不想过度设计这件事。 我要挂断的部分是:控制器有一个“默认”索引函数,它会在父 URL 处加载。所有的业务逻辑都从这里开始(例如,表单提交、对数据做一些事情等)。随着开发的继续,我默认只在同一个控制器中创建新功能。它有效,但我的部分目标是学习最佳实践,有些事情告诉我,我可能会以错误的方式解决这个问题。

    模型是否应该用于数据库读/写功能,或者我也可以将“帮助”功能放在那里,例如generate_random_number、validate_login_credentials、login_session、logout_session等

【问题讨论】:

这是我见过的最干净、经过深思熟虑和格式化的 1 Reputation 问题。 +1 为你好先生! 不应该在“程序员交流”上吗?好问题。 【参考方案1】:

(这是我的主观意见 - 它对我很好)

模型应该是整个应用程序的核心。模型应处理所有业务逻辑和数据库管理。同时,控制器应该尽可能的薄,只提供模型和视图之间的接口。

例如,在登录屏幕中,控制器应该为用户提供登录视图。当用户输入他的信息时,控制器应该处理输入验证并将输入转发给模型,模型应该响应“成功”或“失败”。因此,控制器应该将用户重定向到仪表板,或者将他发送回登录屏幕并显示错误消息 - 分别。

总结一下:模型应该很胖,控制器应该很瘦。

【讨论】:

需要记住的重要一点:这个答案是非常主观的,胖控制器与胖模型是一个由来已久的争论,我们不要将其呈现为好像一侧或另一侧是决定的标准。 Codeigniter 实际上鼓励胖控制器,不同的框架是围绕不同的目标/想法构建的 @jondavidjohn:对于一般 MVC 是正确的,但对于 PHP 开发,胖模型瘦控制器方法显然是最好的方法。 developer.com/design/article.php/3856246/… 这只是说明你缺乏使用 codeigniter 的经验。文章中给出的表单验证示例甚至无法使用 codeigniter,因为 Model 类没有扩展单例 CI 实例,因此它至少可以执行验证利用 Codeigniter 的验证库。因此,虽然在考虑到该组织的情况下构建的框架中这可能是一个好主意,但 codeigniter 不是。 我作为 PHP 开发人员给出了答案。我想那是我的错:P @Codemonkey 完全同意你的看法。即使使用 CI,胖控制器可能发生的问题的示例是无法重用您的代码,因为您无法从任何其他模型/控制器引用控制器操作/属性。***.com/questions/15614905/…【参考方案2】:

控制器

这完全取决于应用程序的性质,但通常答案是您不应该拥有“一个相当大的控制器”。

您将应用程序分解成更小的部分越多,它就越容易维护。

模型

直接来自 Codeigniter 文档

模型是 PHP 类,旨在处理数据库中的信息。

答案是肯定的,你应该只使用模型进行数据交互。

我觉得你自己回答很有趣

"...或者我可以把 'helper' 函数也放在那里吗,..."

Codeigniter 有一个工具可以处理这种类型的功能......

Codeigniter Helpers

【讨论】:

我明白为什么 MVC 会强制执行严格的编码。您建议的是一个“登录控制器”,它调用“登录助手”中的函数,该函数使用“登录模型”来验证用户的凭据。嗯,哎哟! 不,通常对于登录功能,您使用(或编写)一个库,该库将具有与数据库交互的相应模型。如果您阅读了 helper 的描述,它会更适合像您的 generate_random_number 示例这样的任务。 我通常有一个“auth”控制器来处理登录/注销/遗忘密码/等...面向公众的身份验证功能,一旦登录成功,它就会将用户发送到受保护的区域。我有一篇关于这个主题的相当详细的文章jondavidjohn.com/blog/2011/01/… 你会“或多或少”为每个模型配备一个控制器吗?

以上是关于MVC 设计 - 我可以/应该/必须在 CodeIgniter MVC Web 应用程序项目中拥有多少个控制器?的主要内容,如果未能解决你的问题,请参考以下文章

MVC 设计模式

将 MVC 之类的设计模式与 SwiftUI 结合使用

spring mvc 怎么设计缓存

控制器/模型上的 MVC 设计查询

JSF 服务层

java MVC设计模式