MVC。如果View不知道请求如何获取数据?

时间:2013-07-19 19:11:28

标签: php model-view-controller

在MVC应用程序中,很容易理解Controller如何从请求中提取数据并更新Model层,但是当View不能从View模型中检索数据时我感到有点困惑了解这个请求?

例如,如果我去

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

我路由URL并发送请求,最后我在Controller中。在Controller中没有什么需要做的(我认为?)当它到达我的View时我需要产品ID,但View不应该从Request中提取数据,所以我该怎么办?

感谢。

3 个答案:

答案 0 :(得分:4)

  

有两种处理方法,实际上两种方法都表明控制器在这种情况下起着重要的作用。

古人的传说方式..

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

如果这是您想要采用的方法,那么您将需要了解Observer (1)(2) 模式以及如何在PHP {中使用它{3}},(1) 。虽然已经(2)推动远离观察者模式。

由于我没有以任何有意义的方式探讨这种方法,我不会举出任何例子。

这十年来的微不足道......

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

  

FYI:我不再那么肯定,你可以这样称呼“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();

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

如果您的前提是视图和控制器在某种程度上配对(配对是否"GUI Architectures"是否有争议),那么您可以使用相同的方式表达它名。这也允许您将视图的初始化移出控制器。

上面片段中封装的另一个方面是,由于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();
    ..
}

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

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

我的2美分

答案 1 :(得分:0)

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

答案 2 :(得分:0)

MVC就是责任分离。

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

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

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