Single View类用于处理所有模板

时间:2014-04-27 11:44:49

标签: php templates

我刚刚进入MVC架构,我正在尝试创建我自己非常简单的MVC框架,只有核心功能而没有我不需要的额外内容。

我创建了一个View类,可以处理所有视图模板的渲染。

我的问题是,我应该为每个视图模板创建一个View类,而不是为多个模板使用一个吗?

我没有看到我愿意的原因,但我想我会问并确保我不违反任何MVC原则。

class View {
    private $_vars = [];

    public function __set($index, $value) {
        $this->_vars[$index] = $value;
    }

    function render($fileView) {
        $path = ABSPATH . '/view/' . $fileView . 'View.php';

        if(!file_exists($path)) {
            throw new Exception('View not found: '. $path);
        }

        foreach($this->_vars as $key => $value) {
            $$key = $value;
        }

        require $path;
}

2 个答案:

答案 0 :(得分:0)

这取决于您自己的愿望和要求。我在MVC(如)框架中看到了许多不同的视图结构。您的选择包括但不限于:

  • 每页使用一个视图类(类Login,类EditUser)。
  • 在单独的类(类Textbox,类Form)中包含视图的部分内容,您可以使用它来组合更大的视图(类Login包含一个类Form,包含两个Textbox类)。
  • 使用一个视图类渲染多个模板。然后,类用户将负责呈现AddUser模板和EditUser模板等

这完全取决于应用程序的大小和性能/资源,编程 - 易用性,可读性......

答案 1 :(得分:-1)

您应该只创建一个处理框架中模板的类。您可以将其声明为抽象类,然后创建多个更具体的视图(如HTMLView,JSONView等扩展抽象类)。但一般来说,你的方法是正确的。基于MVC结构,View类应该只在磁盘上找到模板文件并将其渲染。所有循环和语句都应该写在该模板文件中。

在您的情况下,View类不应该是单例。对于每个要呈现的模板,您应该创建一个新实例,以避免private $_vars = [];中的变量在不同的控制器中混淆。更好的方法是在View类中创建静态方法,然后像这样调用它:View::render($args)View::render($args, $template_name)

你可以在类似Symfony2的样式中执行此操作,因此控制器只返回带有要在模板中指定的变量的数组(以及可选的.tpl路径,但最好定义逻辑结构并强制View自动查找它)。请不要忘记从您的应用中返回正确的响应,因此请考虑标题,状态等。

我强烈建议您为自己的应用实施一些模板引擎,例如: Twig。它将使您的生活更轻松,视图类将通过这样的引擎开箱即用。