在MVC应用程序中,很容易理解Controller如何从请求中提取数据并更新Model层,但是当View不能从View模型中检索数据时我感到有点困惑了解这个请求?
例如,如果我去
http://www.site.com/product/view/428
我路由URL并发送请求,最后我在Controller中。在Controller中没有什么需要做的(我认为?)当它到达我的View时我需要产品ID,但View不应该从Request中提取数据,所以我该怎么办?
感谢。
答案 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();
..
}
视图的确切实施将取决于您愿意走多远。两个最合理的选择是:
我的2美分
答案 1 :(得分:0)
在MVC中,控制器“控制”模型(信息“存储”)和视图(显示信息)之间的信息流。因此,控制器处理信息的所有变化和与模型的交互,然后将必要的信息发送到视图,然后显示请求/更改的任何信息/等。
答案 2 :(得分:0)
MVC就是责任分离。
换句话说,控制器位于模型和视图之间,并为应用程序执行所有business logic,包括确定需要执行哪些CRUD操作...尽管实际的CRUD操作通常是模型本身的一部分。
MVC更好的名称可能是MCV强调控制器如何位于模型和视图之间。