10

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

我目前对该过程的理解是这样的:

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

  • 尽管在“MVC”名称中没有特别提到,Router 仍然是一个非常重要的部分。正是在这里,请求从原始 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 成员变量中。
    • 模型会将问题对象返回给“问题”控制器

控制器:

  • 这是应用程序的真正主力。除了将消息来回传递给ModelView之外,Controller还负责诸如 Authorization之类的事情和应用程序/“业务”逻辑编辑:根据答案,业务逻辑属于模型。

  • 在正在进行的示例中,控制器将负责:

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

看法:

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

例如

<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>
  • 视图还将包含格式化数据以交付给用户的方法。例如,formatAnswerList()上面的方法将从Controller获取一组答案,并在调用类似的东西时循环遍历它们,include $markupPath . "/formatAnswer.inc"这将是一个答案容器的小模板。

问题:

  • 这种对 MVC 的看法从根本上来说是正确的吗?
  • 如果没有,请仔细解释哪些组件放错了位置,它们应该放在哪里,以及它们应该如何与其他组件正确交互(如果有的话)。
  • 用多少类来描述这个?在我的示例中,有四个对象——一个用于 MVC 的三个组件,一个用于简单地存储相关数据以供传输。这是正常的,还是应该结合一些。如果有,有哪些?
4

2 回答 2

2

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

理解 MVC:模型上的“胖”、控制器上的“瘦”是什么概念?

于 2010-08-23T13:10:53.293 回答
0

从本质上讲,您将所有东西都放在正确的位置。

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

在某些情况下,我看到 ViewModel 被忽略并且模型被传递给 View - 当我第一次看教程时,这让我很困惑,我不喜欢省略 ViewModel,我认为它会混淆事情。

于 2010-08-23T13:12:24.617 回答