0

我已经阅读了很多次文章,但是我仍然无法理解某些部分。文章链接:Model-View-Confusion 第 1 部分:为什么 MVC 中的视图访问模型

下面的代码是我认为我很困惑的代码。

class ListView extends View { 
    public $model; 
    public $template; 
    public $listTemplate; 
    public $errorTemplate; 
    public $itemName = 'items'; 


    public function output() { 
        $result = $this->model->findAll(); 
        if (count($result) > 0) { 
            $this->template = $this->getTemplate($this->listTemplate); 
            $this->template->addSet($this->itemName, $result); 
        } else { 
            $this->template = $this->getTemplate($this->errorTemplate);
        } 

        return $this->template->render(); 
    } 
}

控制器看起来像这样:

class UserController extends Controller { 
    public $viewName = 'ListView'; 

    public function showList() { 
        $this->view->model = $this->model->user; 
        $this->view->listTemplate = 'UserList.tpl'; 
        $this->view->errorTemplate = 'ErrorNoUsers.tpl'; 

    } 
}

据我所知,被分配给从命名传递template的方法继承的方法的结果,并使用来自 像这样命名的再次命名的方法ViewgetTemplateViewlistTemplate$this->getTemplate($this->listTemplate)

我感到困惑的是$template突然有了一个方法,这意味着它变成了一个类。就在这里$this->template->addSet($this->itemName, $result);和`$this->template->render();

你知道那里发生了什么吗?

4

1 回答 1

0

首先,全面披露:我是那篇文章的作者。

它并不是一个完整的代码解决方案,而是一个应用完整的 MVC 关注点分离而不是大多数 PHP 社区声称是 MVC 的 PAC 模式的好处的示例。它如何在幕后工作超出了本文的范围。然而,它应该展示的是视图应该封装模板。在该示例中,模板对象可以是 Smarty 模板、Twig 实例或任何东西。

事后看来,我不应该将引用文件名的变量命名为“模板”。您的困惑是可以理解的: $this->listTemplate; 是对包含模板代码的文件的引用,$this->template; 是加载 listTemplate 中引用的文件的模板对象(可以是 smarty、twig 或其他任何东西)的实例。

我会看看修改它以使其更清晰。我是在两年前写的,如果我再写一遍,我会用不同的措辞和例子解释得更好一些。

于 2012-11-09T12:16:01.713 回答