文档介绍:浅析Yii2的view层设计
:assets资源管理,widgets小组件,layouts布局...
,看一下上述功能都是如何实现的,当然细枝末节的东西不会过多赘述,如果你对此感兴趣又懒得自己去翻代码和文档,那么这篇博客可以快速的给你一个系统的认识。
基础渲染
这一节要谈的是view层是如何完成基础工作的,也就是根据用户传入的参数渲染出一个html页面。
用法
我们在controller里调用$this->render方法,第一个参数是要套用的模板文件(别名),第二个参数是用户数据用于填充模板。
public function actionIndex()
{
return $this->render('index', ['param' => 'hello world']);
}
布局模板和子模板的关系
controller会直接将请求代理给view,这个view也就是mvc的中的v,在整个框架中是一个单例对象。首先通过view->render方法渲染出index这个模板得到的结果保存到$content,接着调用了controller->renderContent($content),这是做什么呢?
public function render($view, $params = [])
{
$content = $this->getView()->render($view, $params, $this);
return $this->renderContent($content);
}
原来,renderContent会找到controller对应的布局layouts文件,并将$content填充到布局文件中,最终才能渲染出完整的页面。其实,layouts布局本身也是一个模板文件,它需要的参数就是content,代表了子模板文件渲染后的结果,这个设计很巧妙。
public function renderContent($content)
{
$layoutFile = $this->findLayoutFile($this->getView());
if ($layoutFile !== false) {
return $this->getView()->renderFile($layoutFile, ['content' => $content], $this);
} else {
return $content;
}
}
上述代码很简单,先找到布局文件(1个controller可以配置1个),然后调用view->renderFile渲染布局模板,传入子模板的渲染结果,就得到了完整页面。
特别提一下,上面子模板渲染用的view->render,而布局模板用的view->renderFile,其区别是render传入的模板是一个别名(这里是index),而renderFile是直接传入模板的文件路径,这里的设计哲学是:view只负责查找模板文件&渲染模板,而布局文件是controller自己设计的概念,所以布局模板的查找是controller负责的,而模板按别名查找是view的职责。
填充