我一直在学习模型-视图-控制器范式(“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 成员变量中。
- 模型会将问题对象返回给“问题”控制器。
控制器:
这是应用程序的真正主力。除了将消息来回传递给Model和View之外,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 的三个组件,一个用于简单地存储相关数据以供传输。这是正常的,还是应该结合一些。如果有,有哪些?