MVC:为什么要打扰“发送”数据到View

时间:2011-10-29 20:26:22

标签: php model-view-controller view controller

我对MVC很新,因此我一直在寻找网络,试图构建我自己的框架,以便真正了解整个概念的工作原理。

无论如何,几乎所有处理MVC的教程似乎总是将需要在视图中显示的数据分配给视图中使用的中间变量。

我的问题是,为什么还要为这个额外的步骤而烦恼呢?

大多数MVC实现最终都包含控制器中的视图...所以如果是这种情况,为什么浪费时间/内存/ cpu周期来创建一个中间变量/数组,然后在View结束时传递给View最后包含在控制器中。

直接在View本身中直接使用Controller变量是否更有意义?

这是一个代码示例,希望澄清我的意思:

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();
}

渲染功能基本上只是一个包含,可以将View带入控制器以显示在链中。如果这是正在发生的事情,人们可以直接在视图中使用$ article,而不是经历将变量分配给View的麻烦。

4 个答案:

答案 0 :(得分:4)

请记住PHP写入时的副本。因此,对简单的变量赋值没有重大的性能影响。

如前所述,范围是一个大问题。视图是与控制器分开的实体,无权访问其数据。当然,您可以将控制器的实例传递给视图,但这会在两者之间产生不必要的过于严格的耦合。视图应该能够独立于控制器工作。

因此,通过明确地将数据分配给视图,您可以将两者分离。因此,您将倾向于编写更好,更清晰的代码。

其次,将数据分配给视图的过程可以进行一些数据清理或其他额外工作。例如,在我的框架中,我认为传递给HTML视图的所有数据都是不安全的。当数据传递给视图时(除非明确标记为安全),它将通过htmlspecialchars进行编码。

最后,您始终可以将对象或数组分配给视图:

$view->assign('article', $article);

如果你这样做,你通常不需要分配很多东西。 (如果你这样做,也许你的页面做了太多不同的事情。)

答案 1 :(得分:4)

MVC是一种非常松散的分类。您正在描述可以工作的一种方式。您在控制器中使用的变量也可能无法在视图中使用。您可能有某种模板处理器从控制器接收数据,以及特殊标记的视图模板,并吐出结果。或者您可能在视图中调用返回现成标记的函数/方法。

答案 2 :(得分:3)

你的include继承了render()方法的变量范围,但render()方法不会从控制器的变量范围继承任何内容。

class foo {

   public function bar() {
      echo $somevar;
   }
}

$somevar = 'test';
$foo = new foo();
$foo->bar();

此代码将不回显任何内容,并向您发出警告:$ somevar尚未定义(如果您的错误报告设置为显示警告)。原因是因为方法和函数不会继承调用它们的范围。

php.net/manual/en/language.variables.scope.php

php.net/manual/en/language.oop5.visibility.php

答案 3 :(得分:2)

由于控制器变量所在的范围。除非你将所有内容都设为全局(非常糟糕),否则你的概念将无效。