【问题标题】:Trying to understand MVC Models, Advice?试图理解 MVC 模型,建议?
【发布时间】:2011-02-15 18:23:48
【问题描述】:

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

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

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

建议很实用:)

【问题讨论】:

    标签: php model-view-controller models finder


    【解决方案1】:

    一个常见的误解是 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 了解概览。

    【讨论】:

      【解决方案2】:

      答案是陈旧的“视情况而定”。

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

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

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

      【讨论】:

        【解决方案3】:

        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 只需 SELECT 多行并将数据转储到 Model 对象中。

        【讨论】:

        • 不幸的是,CakePHP 是错误的。他们没有得到这个概念。 MVC 中的 M 将应用程序逻辑与表示层分离,即 V 和 C(它们共同构成 UI)。模型不仅仅与数据有关,模型还与整个领域/业务逻辑有关。考虑martinfowler.com/eaaCatalog/serviceLayer.html 给出的图表,了解哪些层是模型的一部分。
        【解决方案4】:

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

        $foo = ModelFoo::find($id)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-03-06
          • 1970-01-01
          • 2012-02-05
          • 2015-09-20
          • 2011-11-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多