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

Age*_*rum 10 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成员变量中.
    • 模型将问题的对象返回到"问题"控制器.

控制器:

  • 这是该应用程序的真正主力.除了在模型视图中来回传递消息之外,Controller还负责授权等事务和应用程序/"业务"逻辑编辑:每个答案,业务逻辑属于模型.

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

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

视图:

  • 总的来说,View是应用程序中最简单的部分.它主要包含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>
Run Code Online (Sandbox Code Playgroud)
  • View还包含格式化数据以交付给用户的方法.例如,formatAnswerList()上面的方法将从Controller中获取一系列答案,并循环访问它们,同时调用类似于include $markupPath . "/formatAnswer.inc"只是一个答案容器的小模板.

问题:

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

Dav*_*vid 2

我认为这个描述对控制器的重视程度过高,而对模型的重视程度不够。理想情况下,模型是业务逻辑所在的位置。控制器实际上只是站点用户的一个界面,将控制路由到需要去的地方。看一下之前关于该主题的讨论:

理解 MVC:模型上的“Fat”和控制器上的“Skinny”是什么概念?