Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 处理所有模板的单个视图类_Php_Templates - Fatal编程技术网

Php 处理所有模板的单个视图类

Php 处理所有模板的单个视图类,php,templates,Php,Templates,我刚刚进入MVC架构,我正在尝试创建我自己非常简单的、我理解的MVC框架,只使用核心功能,没有我不需要的额外功能 我制作了一个视图类,可以处理所有视图模板的渲染 我的问题是,我应该为每个视图模板创建一个视图类,而不是为多个模板使用一个视图类吗 我不知道为什么我会这样做,但我想我会问一下,并确保我没有违背任何MVC原则 class View { private $_vars = []; public function __set($index, $value) {

我刚刚进入MVC架构,我正在尝试创建我自己非常简单的、我理解的MVC框架,只使用核心功能,没有我不需要的额外功能

我制作了一个视图类,可以处理所有视图模板的渲染

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

我不知道为什么我会这样做,但我想我会问一下,并确保我没有违背任何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;
}

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

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

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


我强烈建议您在应用程序中实现一些模板引擎,例如
Twig
。它将使您的生活更加轻松,并且视图类将通过这种引擎开箱即用。

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

  • 每个页面使用一个视图类(类登录,类编辑用户)
  • 甚至将视图的一部分包装在单独的类中(类Textbox、类Form),使用这些类集成更大的视图(类登录将由一个类表单组成,由两个Textbox类组成)
  • 使用一个视图类渲染多个模板。然后,类用户将负责呈现AddUser模板和EditUser模板等

这一切都取决于应用程序的大小,以及性能/资源、编程易用性、可读性等方面的愿望……

您应该可以使用一个来处理它。仅供参考:PHP有一个
extract()
函数,它完成了您在
foreach
循环中所做的操作。如果我想做任何特定的事情,我想我总是可以从这个视图类进行扩展。是的,没错;)这就是为什么可以创建JSONView来创建JSON或XMLView。但是视图类不应该做任何特定的事情。它应该只将变量传递到模板文件,在模板文件中会发生任何其他逻辑。@tereško你能告诉我哪里错了吗?我想我已经清楚地指出了视图和模板之间的区别,谢谢:)除了第2点:我认为在这些类或任何其他组件中实现toString()也是一个好主意。