【问题标题】:MVC, where do the classes go?MVC,课程去哪儿了?
【发布时间】:2010-09-13 09:39:59
【问题描述】:

我对 MVC 的理解如下(如果是大错特错,我毕竟是新手)

  1. 模型是与数据库交互的东西
  2. 视图是页面的设计/布局
  3. 控制器是一切开始的地方,本质上是页面逻辑

我正在使用CodeIgniter,但我会大胆猜测它不仅限于此,甚至可能仅限于 PHP 框架。

我在哪里放置全局类?

我可能有一个 Products 模型,然后我运行一个从数据库中收集 20 个产品的查询。我现在是制作 20 个模型还是应该为它单独设置一个类,如果是后者,我将这个类放在哪里(其他控制器也需要使用它)

【问题讨论】:

    标签: php model-view-controller oop


    【解决方案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 个“部分”:

        1. 行为
        2. 组件
        3. 帮手

        许多模型使用的逻辑应该作为一种行为。我不知道 CodeIgniter 是否有这个逻辑,但如果没有,我会尝试这样实现。你可以阅读行为here

        (组件帮助控制器共享逻辑,帮助器以同样的方式帮助视图)。

        【讨论】:

          【解决方案4】:

          最简单的方法是:

          1. 每个数据库表都有一个模型类。在这种情况下,它将是一个包含所有产品详细信息的对象。
          2. 将这些类放入包/命名空间,例如 com.company.model (Java / C#)
          3. 将 DAO 类放入像 com.company.model.dao 这样的包中
          4. 您的视图将使用来自会话/请求/控制器的数据在这种情况下,我将有一个 List
          5. 哦,您使用的是 PHP。不知道这会如何改变事情,但我想它有一个集合框架,就像任何现代语言一样。

          【讨论】:

            【解决方案5】:

            @Alexander 提到了 CakePHPs BehaviorsComponentsHelpers。这些对于抽象出通用功能非常有用。我发现行为特别有用,因为大部分业务逻辑都包含在模型中。我目前正在从事一个项目,我们的行为如下:

            • 可锁定
            • 可发布
            • 可标记
            • 可评分
            • 可评论

            等等

            对于甚至超越 MVC 框架的代码,即您用于各种与您正在使用的特定框架无关的东西的代码库 - 在我们的例子中是视频编码类等。CakePHP 有 供应商 文件夹。

            任何与 CakePHP 毫无关系的东西都在里面。

            我怀疑 CodeIgniter 的结构没有那么灵活,它比 CakePHP 更小更轻,但快速查看 CakePHP Manual 以了解 Behaviors、Components、Helper 和 Vendors 文件夹可能会有所帮助。

            从你的模型中包含一些常见的帮助类应该是一件容易的事,保持良好和DRY

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-03-03
              • 2014-03-15
              • 2015-07-17
              • 2012-10-30
              • 2013-05-23
              • 1970-01-01
              • 2012-03-13
              相关资源
              最近更新 更多