具体来说,属于模型,视图和控制器?

时间:2010-08-23 12:59:04

标签: model-view-controller design-patterns application-design

我一直在学习模型 - 视图 - 控制器范例(“MVC”),但我很困惑,因为有些教程与其他教程相矛盾。

我目前对这个过程的理解看起来像这样:

路由器/调度程序/前端控制器:

  • 虽然“MVC”名称中没有特别引用,但路由器仍然是一个非常重要的部分。在这里,请求从原始URL转换为特定控制器。例如,路由请求www.StackUnderflow.com/question/123到应用程序的“问题”控制器

型号:

  • 这是从某些存储源(如数据库或XML文件)收集原始数据的位置。该模型用作抽象层,将特定数据的 Controller的请求转换为(例如)SQL查询,并将查询结果转换为标准格式,如数据对象。

  • 例如,在上述/ browse / all场景中:

    • “问题”控制器会询问模型“请提供问题123的数据。”
    • 模型然后将其转换为“SELECT * FROM Questions WHERE Id = 123;”并把它放到数据库中
    • 数据库会向模型返回“问题”记录
    • 模型将记录,并将其转换为问题数据对象
    • 然后模型要求做同样的事情“SELECT * FROM Answers WHERE QuestionID = 123;”并从结果集中创建一个Answer对象数组,并将其添加到Question对象的answers成员变量中。
    • 模型会将Question对象返回“Question”Controller

控制器:

  • 这是该应用程序的真正主力。除了将消息来回传递到 Model View 之外, Controller 还负责Authorization 和应用程序之类的事情。 /“business”逻辑编辑:每个答案,业务逻辑属于Model。

  • 在正在进行的示例中,Controller将负责:

    • 确保用户已登录。
    • 从网址确定QuestionId。
    • 确定要使用的视图。
    • 发送HTTP代码并根据需要重定向。
    • Model 询问数据,并将所需数据存储在成员变量中。

查看:

  • 总的来说,View是应用程序中最简单的部分。它主要包含HTML模板的基本应用程序。这些模板将具有占位符,以便从Controller的成员变量中将数据插入到模板中:

e.g。

<html>

  <head>
    <title>
      <?php $question->getTitle() ?>
    </title>
  </head>

  <body>
    <h1> <?php $question->getQuestionText(); ?> </h1>
    <h2> Answers: </h2>
    <div class="answerList"> 
      <?php formatAnswerList($question->getAnswers()); ?> 
    </div>
  </body>

</html>
  • View还包含格式化数据以交付给用户的方法。例如,上面的formatAnswerList()方法会从 Controller 中获取一系列答案,并在调用像include $markupPath . "/formatAnswer.inc"这样的小模板时循环遍历它们。只是一个答案容器。

问题:

  • MVC的这种观点是否基本准确?
  • 如果没有,请仔细说明哪些组件放错了位置,实际应该去哪里,以及它们应该如何与其他组件正确互动(如果有的话)。
  • 用多少个类来描述这个?在我的示例中,有四个对象 - 一个用于MVC的三个组件,另一个用于存储相关数据以进行传输。这是正常的,还是应该合并一些。如果是这样,哪些?

2 个答案:

答案 0 :(得分:2)

我认为这种描述对控制器的影响太大,而在模型上则不够。理想情况下,该模型位于业务逻辑所在的位置。控制器实际上只是站点用户的接口,它需要路由控制。看一下之前关于该主题的讨论:

Understanding MVC: Whats the concept of "Fat" on models, "Skinny" on controllers?

答案 1 :(得分:0)

基本上,你把所有东西都放在了正确的位置。

在您的示例中,您定义了一个Question类 - 它将被称为ViewModel,它只是一个容器,用于在视图中查看/从View中检索的所有数据。

在某些情况下,我看到ViewModel被忽略了,Model被传递给View - 当我第一次看教程时,这让我很困惑,我不喜欢省略ViewModel,我认为这会让事情变得混乱。