我刚刚进入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;
}
答案 0 :(得分:0)
这取决于您自己的愿望和要求。我在MVC(如)框架中看到了许多不同的视图结构。您的选择包括但不限于:
这完全取决于应用程序的大小和性能/资源,编程 - 易用性,可读性......
答案 1 :(得分:-1)
您应该只创建一个处理框架中模板的类。您可以将其声明为抽象类,然后创建多个更具体的视图(如HTMLView,JSONView等扩展抽象类)。但一般来说,你的方法是正确的。基于MVC结构,View类应该只在磁盘上找到模板文件并将其渲染。所有循环和语句都应该写在该模板文件中。
在您的情况下,View类不应该是单例。对于每个要呈现的模板,您应该创建一个新实例,以避免private $_vars = [];
中的变量在不同的控制器中混淆。更好的方法是在View类中创建静态方法,然后像这样调用它:View::render($args)
或View::render($args, $template_name)
。
你可以在类似Symfony2的样式中执行此操作,因此控制器只返回带有要在模板中指定的变量的数组(以及可选的.tpl路径,但最好定义逻辑结构并强制View自动查找它)。请不要忘记从您的应用中返回正确的响应,因此请考虑标题,状态等。
我强烈建议您为自己的应用实施一些模板引擎,例如: Twig
。它将使您的生活更轻松,视图类将通过这样的引擎开箱即用。