MVC,课程去哪儿了?
Posted
技术标签:
【中文标题】MVC,课程去哪儿了?【英文标题】:MVC, where do the classes go? 【发布时间】:2010-09-13 09:39:59 【问题描述】:我对 MVC 的理解如下(如果是大错特错,我毕竟是新手)
-
模型是与数据库交互的东西
视图是页面的设计/布局
控制器是一切开始的地方,本质上是页面逻辑
我正在使用CodeIgniter,但我会大胆猜测它不仅限于此,甚至可能仅限于 php 框架。
我在哪里放置全局类?
我可能有一个 Products 模型,然后我运行一个从数据库中收集 20 个产品的查询。我现在是制作 20 个模型还是应该为它单独设置一个类,如果是后者,我将这个类放在哪里(其他控制器也需要使用它)
【问题讨论】:
【参考方案1】:在讨论如何处理产品时,模型是一个错误的词:每个产品都是一个值对象 (VO)(或数据传输对象/DTO,任何更适合您的词)。值对象通常具有与表相同的字段。在您的情况下,ProductVO 应该具有 Products 表中的字段。
Model 是一个 数据访问对象 (DAO),它具有类似
的方法findByPk --> returns a single value object
findAll --> returns a collection of value objects (0-n)
etc.
在您的情况下,您将拥有一个具有上述方法的 ProductDAO。然后,此 ProductDAO 将返回 ProductVO 和它们的集合。
数据访问对象还可以返回 业务对象 (BO),其中可能包含多个 VO 和特定于业务案例的其他方法。
附录: 在您的控制器中,您调用 ProductDAO 来查找您想要的产品。 然后将返回的 ProductVO(s) 传递给视图(在 Java 中作为请求属性)。然后视图循环/显示来自 productVO 的数据。
【讨论】:
【参考方案2】:模型 是您的应用程序中发生业务逻辑的一部分。模型表示对象之间的现实关系和依赖关系,例如:员工向经理报告,经理监督许多员工,经理可以将任务分配给员工,任务在过期时发出通知。模型 CAN 和最常见的 DO 与数据库接口,但这不是必需的。
视图基本上是所有可以显示或帮助显示的东西。视图包含模板、模板对象、处理模板组合和嵌套、使用页眉和页脚进行包装,并以一种众所周知的格式(X/html,还有 XML、RSS/Atom、CSV)生成输出。
Controller 是将用户操作转换为模型操作的转换层。换句话说,它告诉模型该做什么并返回一个响应。控制器方法尽量小,所有业务处理都在Model中,视图逻辑处理在View中。
现在,回到你的问题。这真的取决于您是否需要为每个产品单独分类。在大多数情况下,一个类就足够了,应该创建它的 20 个实例。由于产品代表业务逻辑,它应该属于应用程序的模型部分。
【讨论】:
【参考方案3】:CakePHP 中还有 3 个“部分”:
-
行为
组件
帮手
许多模型使用的逻辑应该作为一种行为。我不知道 CodeIgniter 是否有这个逻辑,但如果没有,我会尝试这样实现。你可以阅读行为here。
(组件帮助控制器共享逻辑,帮助器以同样的方式帮助视图)。
【讨论】:
【参考方案4】:最简单的方法是:
-
每个数据库表都有一个模型类。在这种情况下,它将是一个包含所有产品详细信息的对象。
将这些类放入包/命名空间,例如 com.company.model (Java / C#)
将 DAO 类放入像 com.company.model.dao 这样的包中
您的视图将使用来自会话/请求/控制器的数据在这种情况下,我将有一个 List
【讨论】:
【参考方案5】:@Alexander 提到了 CakePHPs Behaviors、Components 和 Helpers。这些对于抽象出通用功能非常有用。我发现行为特别有用,因为大部分业务逻辑都包含在模型中。我目前正在从事一个项目,我们的行为如下:
可锁定 可发布 可标记 可评分 可评论等等
对于甚至超越 MVC 框架的代码,即您用于各种与您正在使用的特定框架无关的东西的代码库 - 在我们的例子中是视频编码类等。CakePHP 有 供应商 文件夹。
任何与 CakePHP 毫无关系的东西都在里面。
我怀疑 CodeIgniter 的结构没有那么灵活,它比 CakePHP 更小更轻,但快速查看 CakePHP Manual 以了解 Behaviors、Components、Helper 和 Vendors 文件夹可能会有所帮助。
从你的模型中包含一些常见的帮助类应该是一件容易的事,保持良好和DRY
【讨论】:
以上是关于MVC,课程去哪儿了?的主要内容,如果未能解决你的问题,请参考以下文章