Model view controller 具体来说,什么属于模型、视图和控制器?

Model view controller 具体来说,什么属于模型、视图和控制器?,model-view-controller,design-patterns,application-design,Model View Controller,Design Patterns,Application Design,我一直在学习模型-视图-控制器范例(“MVC”),但我很困惑,因为有些教程与其他教程相矛盾 我目前对该过程的理解如下: 路由器/调度器/前端控制器: 虽然在“MVC”名称中没有特别提及,但路由器仍然是一个非常重要的部分。就是在这里,请求从原始URL转换到特定的控制器。例如,将对www.StackUnderflow.com/question/123的请求路由到应用程序的“question”控制器 型号: 这是从某些存储源(如数据库或XML文件)收集原始数据的地方。该模型充当抽象层,将控制器对

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

我目前对该过程的理解如下:

路由器/调度器/前端控制器:
  • 虽然在“MVC”名称中没有特别提及,但路由器仍然是一个非常重要的部分。就是在这里,请求从原始URL转换到特定的控制器。例如,将对www.StackUnderflow.com/question/123的请求路由到应用程序的“question”控制器
型号:
  • 这是从某些存储源(如数据库或XML文件)收集原始数据的地方。该模型充当抽象层,将控制器对特定数据的请求转换为(例如)SQL查询,并将查询结果转换为数据对象之类的标准格式

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

    • “问题”控制员会问模型“请提供问题123的数据。”
    • 然后,模型将其转换为“从Id=123的问题中选择*”,并将其放入数据库
    • 数据库将向模型返回一条“问题”记录
    • 模型将获取记录,并将其转换为问题数据对象
    • 然后,模型会询问并执行相同的操作“SELECT*FROM Answers WHERE QuestionID=123”;并从结果集创建一个答案对象数组,并将其添加到问题对象的Answers成员变量中
    • 模型将问题对象返回给“问题”控制器
控制器:
  • 这才是应用程序真正的主力。除了向模型和视图来回传递消息外,控制器还负责授权和应用程序/“业务”逻辑编辑:根据回答,业务逻辑属于模型

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

    • 确保用户已登录
    • 从URL确定问题ID
    • 确定要使用的视图
    • 发送HTTP代码并在需要时重定向
    • 向模型询问数据,并将所需数据存储在成员变量中
视图:
  • 总的来说,视图是应用程序中最简单的部分。在基本应用程序中,它主要由HTML模板组成。这些模板将具有占位符,用于从控制器的成员变量向模板中插入数据:
e、 g


答案:
  • 视图还将包含格式化数据以交付给用户的方法。例如,上面的
    formatAnswerList()
    方法将从控制器获取一系列答案,并在调用类似
    include$markupPath的内容时循环使用这些答案。“/formatAnswer.inc”
    这将是一个答案容器的小模板
问题:
  • MVC的这种观点从根本上是正确的吗
  • 如果没有,请仔细解释哪些组件放错了位置,它们应该放在哪里,以及它们应该如何与其他组件正确交互(如果有)
  • 有多少类被用来描述这一点?在我的示例中,有四个对象——一个用于MVC的三个组件,另一个用于存储相关数据以进行传输。这是正常的,还是应该结合一些。如果有,哪些

我认为这种描述对控制器的重视太多,而对模型的重视不够。理想情况下,模型位于业务逻辑所在的位置。控制器实际上只是站点用户的一个界面,用于控制它需要去哪里。请看一下之前关于该主题的讨论:


基本上你把所有东西都放在正确的地方

在您的示例中,您定义了一个问题类,称为ViewModel,它只是一个容器,用于存储视图中要使用/从视图中检索的所有数据


在某些情况下,我看到ViewModel被忽略,模型被传递给视图-这让我在第一次阅读教程时感到困惑,我不喜欢忽略ViewModel,我认为这会让事情变得混乱。

您的ViewModel是我的控制器,还是我感到困惑?我将模式视为三个不同的对象(因此,我的视图引用$QUEST而不是$self)。你所说的忽略ViewModel,会不会像没有控制器,只是让模型和视图直接相互对话?把模型想象成你实际的对象和逻辑域,把ViewModel想象成一个简单的POCO DTO,为视图提供数据,控制器作为交换台操作员,传递信息(并处理任何与UI相关的事情,如会话状态,这些不属于模型中)。@David:好的,“ViewModel”是这样的就是你所说的一个对象,用于保存数据,只用于传输/存储,模型用于处理数据,控制器用于存储数据/状态,并在ModelView之间传递数据,而视图仅用于呈现HTML?这基本正确吗?@agentNuntrum:听起来不错。模型可能会变得非常复杂。对于大多数对于我的站点来说,业务逻辑被保留在服务层之后,模型本质上只是与服务的交互。它最终比我希望的更加程序化,但它就是这样。我想我知道你要做什么了。我在控制器中拥有的很多东西实际上是模型的一部分,抽象层呃,我在模型中看到的可能更多的是一个单独的实体(可能被认为是模型的一个子集),而不是模型的目的,对吗?你可能会upd吗
<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>