在 MVC 应用程序中,很容易理解控制器如何从请求中提取数据并更新模型层,但是当视图不知道时,视图应该如何从模型层检索数据我有点困惑。要求?
例如,如果我去
http://www.site.com/product/view/428
我路由 URL 并发送请求,最终进入控制器。控制器中不需要做任何事情(我认为?),当它到达我的视图时,我需要产品 ID,但视图不应该从请求中提取数据,我该怎么办?
谢谢。
在 MVC 应用程序中,很容易理解控制器如何从请求中提取数据并更新模型层,但是当视图不知道时,视图应该如何从模型层检索数据我有点困惑。要求?
例如,如果我去
http://www.site.com/product/view/428
我路由 URL 并发送请求,最终进入控制器。控制器中不需要做任何事情(我认为?),当它到达我的视图时,我需要产品 ID,但视图不应该从请求中提取数据,我该怎么办?
谢谢。
有两种方法可以处理这个问题,实际上这两种方法都表明控制器在这种情况下扮演着重要的角色。
解决此问题的第一个选择是尽可能接近经典 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
在 MVC 中,控制器“控制”模型(信息“存储”)和视图(显示信息)之间的信息流。因此,控制器处理信息的所有变化以及与模型的交互,然后将必要的信息发送到视图,然后显示请求/更改/等的任何信息。
MVC 是关于职责分离的。
换句话说,控制器位于模型和视图之间,为应用程序执行所有业务逻辑,包括确定需要发生哪些CRUD操作……尽管实际的 CRUD 操作通常是模型本身的一部分。
MVC 的一个更好的名称可能是 MCV,以强调控制器如何位于模型和视图之间。