3

我正在编写自己的 MVC 以学习它。由于在理解模型和缺乏可行的例子方面存在一些困难,我几乎把所有的东西都“down-pat”和我的主要内容写在了模型之外。

现在,有人告诉我,模型应该代表单行,有人告诉我,您的模型类应该更新/插入和删除行,任何涉及获取单行或多行的内容 - 都应该使用“查找器”类。

所以... a) 什么是查找器类,b) 我如何在使用示例中实现它,c) 我被告知的关于模型的内容是正确的,还是有比“查找器”更好的方法?

建议很实用:)

4

4 回答 4

6

一个常见的误解是 MVC 中的 M 仅与数据库有关。MVC 的主要目的是以 M 不了解 VC 的方式将表示层与其余应用程序分开。

V 和 C 构成 UI,用户可以通过它与您的应用程序交互的外层。C 处理来自 V 的所有输入请求,并在需要时委托给 M。V 显示 M 中的变化。在基于 Web 的 MVC 中,V 在内容、表示和行为方面进一步分离,例如 HTML、CSS 和 JavaScript。

应用程序本身位于 M 内部。它应该能够与 UI 隔离运行。因此,它不仅包括数据访问层,还包括几乎所有其他层,还包括表示层。它可以(但可能不)包含 DAL、服务层、域对象等 - 您的应用程序需要的任何内容,无论是从 RSS 提要获取数据还是将数据推送到 Web 服务或发送电子邮件或计算收入等。

DAL 是否应该代表单行、表格或其他内容取决于您。它是您架构的重要设计选择。四种常见模式是 Table Data Gateway、Row Data Gateway、Active Record 和 Data Mapper。

查看http://martinfowler.com/eaaCatalog/index.html了解概览。

于 2010-05-05T07:35:40.863 回答
0

答案是简单的“它取决于”。

模型不必表示单行或行集合(我假设您在这里谈论的是数据库数据)。您的模型应该用于映射您的业务逻辑实体。只有模型数据的一个子集需要持久性,这可以通过与数据库交互来实现。

如果我们参考 Doctrine 案例,这就是为什么即将到来的 Doctrine 2 不会强制您的模型从一个教义记录基类扩展。

我相信这就是为什么像 Zend Framework 这样的 MVC 框架没有为您提供“Zend_Model”概念的原因。您的模型应该逐案实施。

于 2010-05-05T06:27:53.117 回答
-1

CakePHP 说:

模型表示数据并在 CakePHP 应用程序中用于数据访问。模型通常表示数据库表,但可用于访问存储数据的任何内容,例如文件、LDAP 记录、iCal 事件或 CSV 文件中的行。

http://book.cakephp.org/view/66/Models

基本上,该模型代表业务数据的持久存储。通常,这是一个数据库。

一旦我们开始谈论数据库和对象,它通常会落入备受争议的“对象-关系映射”领域,即有多少 PHP 框架实现了模型。

一个模型通常代表一个表中的一行,但它也可以是来自多个表的一组行。模型可以用无数种方式表示:从像Doctrine db 对象这样复杂和臃肿的东西到像文本文件这样简单的东西。

我首选的表示模型的方式是主表上的每个模型一行,与任何相关的父表连接并包含任何子表的成员对象。有效实现这一点的唯一方法是使用某种“集合”类,以便可以一次获取所有对象,这样您就不会进行不必要的查询。

编辑:要直接回答您的问题,是的,如果您想尽量减少访问数据库的次数,“finder”或“Collection”类是绝对必要的。如果每个模型都是自给自足的,那么您将执行数百个单独的“SELECT FROM table WHERE id=x”查询。finder 或 Collection 可以选择多行并将数据转储到模型对象中。

于 2010-05-05T04:38:36.237 回答
-2

您可以将查找器实现为模型类的静态方法:

$foo = ModelFoo::find($id)

于 2010-05-05T04:09:37.223 回答