【发布时间】:2011-12-17 23:50:23
【问题描述】:
我对 MVC 非常陌生,因此我一直在网上搜索,试图构建自己的框架,以真正了解整个概念的工作原理。
无论如何,几乎所有处理 MVC 的教程似乎总是将需要在视图中显示的数据分配给然后在视图中使用的中间变量。
我的问题是,为什么要费心这额外的步骤?
大多数 MVC 实现最终都包括控制器内的视图...所以如果是这种情况,为什么要浪费时间/内存/cpu 周期来创建中间变量/数组,然后在视图结束时传递给视图最后包含在控制器中。
直接在视图本身中使用控制器变量不是更有意义吗?
这是一个代码示例,希望能阐明我的意思:
class News_Controller
{
public function main(array $getVars)
{
$newsModel = new News_Model;
//get an article
$article = $newsModel->get_article($getVars['article']);
//create a new view and pass it our template name
$view = new View_Model($this->templateName);
//assign article data to view
$view->assign('title' , $article['title']);
$view->assign('content' , $article['content']);
$view->render();
}
render 函数基本上只是一个包含,将 View 带入 Controller 以在链中显示。如果是这样的话,可以直接在 View 中使用 $article,而不必费心为 View 分配变量。
【问题讨论】:
-
将值从“控制器”传递到“视图”的方法在 Faux/Web-MVC 框架中是多种多样的。虽然重用本地范围同样可行,但通常会为外观创建值对象或数组,并假设存在视图变量的“收集”过程。
-
在上面的代码中,如果没有以某种方式传递给视图,您希望视图对象如何访问控制器对象中的变量?此外,似乎您可以简单地将整篇文章传递到您的视图中,而不是一个一个地传递每个文章变量。
-
@dqhendricks,$view->render() 方法基本上只是 'include('view.php')',所以视图包含在控制器中。一旦发生这种情况,Controller 中的变量就会变成 View 文件中的局部变量。从我在网上看到的示例中,视图总是在某些时候被包含到控制器中。是否有另一种方法可以在不包含在控制器中的情况下渲染视图,而控制器又包含在 index.php 文件中...?
-
@Chrys G. 我认为您对 PHP 中变量作用域的工作方式感到困惑。仅仅因为从控制器对象中调用渲染方法并不意味着它继承了它的变量范围。属于视图的方法只能访问视图的变量范围。 php.net/manual/en/language.variables.scope.php
标签: php model-view-controller view controller