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