浅析Yii2的view层设计.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
浅析Yii2的view层设计

浅析Yii2的view层设计 Yii2.0的view层提供了若干重要的功能:assets资源管理,widgets小组件,layouts布局... 下面将通过对Yii2.0代码直接进行分析,看一下上述功能都是如何实现的,当然细枝末节的东西不会过多赘述,如果你对此感兴趣又懒得自己去翻代码和文档,那么这篇博客可以快速的给你一个系统的认识。 基础渲染 这一节要谈的是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的职责。 填充模板 无论是布局还是子模板,在填充时都是通过view-renderPhpFile方法实现的,它用到了php的ob库实现数据的捕捉,实现非常简单: public function renderPhpFile($_file_, $_params_ = []) { ob_start(); ob_implicit_flush(false); extract($_params_, EXTR_OVERWRITE); require($_file_); return ob_get_clean(); } ob_start():创建1个新的用户级输出缓冲区,捕获输出的内容到内存。 ob_implicit_flush(false):设置SAPI级的输出缓冲区模式,不自动刷新。 ob_get_clean():得到当前用户缓冲区的内容并删除当前的用户缓冲区。 如果你对ob系列函数不了解,可以点访问官方文档。如果你对用户,SAPI缓冲区不了解,可以访问这里。 总之,ob_start后所有echo输出都会被缓存起来,然后通过extract方法可以将用户参数params解开为局部变量,最后通过require包含模板文件,这样模板文件就可以直接按局部变量$var1,$var2的方式访问方便的访问$params里的数据了,这个函数最后将缓冲的数据全部取出返回,完成了模板的渲染。 举个例子 这里拿布局文件为例(

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档