1

在 MVC 应用程序中,很容易理解控制器如何从请求中提取数据并更新模型层,但是当视图不知道时,视图应该如何从模型层检索数据我有点困惑。要求?

例如,如果我去

http://www.site.com/product/view/428

我路由 URL 并发送请求,最终进入控制器。控制器中不需要做任何事情(我认为?),当它到达我的视图时,我需要产品 ID,但视图不应该从请求中提取数据,我该怎么办?

谢谢。

4

3 回答 3

4

有两种方法可以处理这个问题,实际上这两种方法都表明控制器在这种情况下扮演着重要的角色。

古人的传说..

解决此问题的第一个选择是尽可能接近经典 MVC 。这有点与人们的意思有关,当他们说“你不能为 web 做经典的 MVC”时。在经典 MVC中,视图观察模型层。而那部分实际上是可以实现的。

如果这是您想要采用的方法,那么您将必须了解 Observer (1)(2)模式以及如何在 PHP (1)(2)中使用它。尽管有一些推动远离观察者模式的努力。

由于我没有以任何有意义的方式探索这种方法,因此我不会给出任何示例。

这十年的微不足道..

如果您阅读 Fowler 的 “GUI 架构”文章,您可能会注意到视图和控制器形成对的状态部分。当将 MVC 的思想应用于 Web 上下文时,在应用程序的引导阶段有一些方法可以从中受益。

供参考 :我不再那么确定,您可以这样称呼“Model2 MVC”。有一些明显的不一致之处。当我感到无聊时,我会更多地探讨这个令人讨厌的怀疑。

考虑这个片段:

 $router->route( $request );
 $resource = $request->getParameter('controller');

 $view = new {'Views\\'.$resource}($serviceFactory);
 $controller = new {'Controller\\'$resource}($serviceFactory, $view);

 $method = $request->getMethod(); //post, get & etc.
 $command = $request->getParameter('action');

 $controller->{$command.$method}($request);

 $view->{$command}();
 echo $view->render();

您的示例 URL 中的控制器片段将是"product"操作将包含"list". 我留下了这些名称而不是资源/命令对,以减少混乱。

如果你一开始的前提是视图和控制器在某种程度上是配对的(配对是否内值得商榷),那么您可以使用相同的名称来表达它。这也使您可以将视图的初始化移出控制器。

封装在上面片段中的另一个方面是,由于 Web 的请求-响应性质,控制器中的每个操作都需要视图中的伴随操作。与控制器中的操作类似,您也可以选择在视图中调用特定的、与路由相关的方法。这将从视图中删除一些样板条件,让您更好地组织整个事情(这有点“高度主观”)

那么..您如何将/product/view/428请求转换为网站上可见的内容?

您可能知道,控制器的职责是改变模型层的状态,在这种情况下,它可能会编写如下代码:

public function getView( $request )
{
    $warehouse = $this->serviceFactory->provide('warehouse');
    $warehouse->chooseItem( $request->getParameter('id') );
}

您的视图实例使用模型层的已启动服务来获取数据:

public function view()
{
    $warehouse = $this->serviceFactory->provide('warehouse');
    ..
    ..
    // retrieve data about sales for product with ID: 428
    $something = $warehouse->getSalesFigures();
    ..
}

视图的确切实现将取决于您愿意深入多远。两个最合理的选择是:

  • 获取数据、检查数据并在必要时选择模板并将数据转储到其中
  • 使用一组表示对象来处理模型层,并根据结果将这些表示对象绑定到蚂蚁数量的模板

my 2 cents

于 2013-09-12T02:52:40.140 回答
0

在 MVC 中,控制器“控制”模型(信息“存储”)和视图(显示信息)之间的信息流。因此,控制器处理信息的所有变化以及与模型的交互,然后将必要的信息发送到视图,然后显示请求/更改/等的任何信息。

于 2013-07-19T19:38:04.547 回答
0

MVC 是关于职责分离的。

  • 模型负责存储和建模应用程序的数据。
  • 视图负责向用户显示信息。
  • 控制器实际上有多种职责:
    • 决定何时创建模型的新实例。
    • 决定要读取的模型实例并将它们传递给适当的视图。
    • 根据从视图传回的数据确定模型实例中的哪些数据需要更新。
    • 决定何时删除不再需要的模型实例。

换句话说,控制器位于模型和视图之间,为应用程序执行所有业务逻辑,包括确定需要发生哪些CRUD操作……尽管实际的 CRUD 操作通常是模型本身的一部分。

MVC 的一个更好的名称可能是 MCV,以强调控制器如何位于模型和视图之间。

于 2013-07-19T19:43:48.380 回答