Yii源码阅读笔记(十九)
View中渲染view视图文件的前置和后置方法,以及渲染动态内容的方法:
/** * @return string|boolean the view file currently being rendered. False if no view file is being rendered. */ public function getViewFile() { return end($this->_viewFiles);//返回[_viewFiles]中的最后一个view文件,即默认被渲染的文件 } /** * This method is invoked right before [[renderFile()]] renders a view file. * Render的前置事件,在执行[renderFile()]方法时被调用,默认触发[[EVENT_BEFORE_RENDER]]事件 * The default implementation will trigger the [[EVENT_BEFORE_RENDER]] event. * If you override this method, make sure you call the parent implementation first. * 如果要重写该方法,要确保首先调用父类的同名方法 * @param string $viewFile the view file to be rendered. * @param array $params the parameter array passed to the [[render()]] method. * @return boolean whether to continue rendering the view file. */ public function beforeRender($viewFile, $params) { //实例化ViewEvent $event = new ViewEvent([ 'viewFile' => $viewFile, 'params' => $params, ]); //触发[EVENT_BEFORE_RENDER]事件 $this->trigger(self::EVENT_BEFORE_RENDER, $event); return $event->isValid;//返回值可以判断是否继续渲染文件 } /** * This method is invoked right after [[renderFile()]] renders a view file. * Render的后置事件,在执行[renderFile()]方法后被调用,默认触发[[EVENT_AFTER_RENDER]]事件 * The default implementation will trigger the [[EVENT_AFTER_RENDER]] event. * If you override this method, make sure you call the parent implementation first. * 如果要重写该方法,要确保首先调用父类的同名方法 * @param string $viewFile the view file being rendered. * @param array $params the parameter array passed to the [[render()]] method. * @param string $output the rendering result of the view file. Updates to this parameter * will be passed back and returned by [[renderFile()]]. */ public function afterRender($viewFile, $params, &$output) { if ($this->hasEventHandlers(self::EVENT_AFTER_RENDER)) {//判断[EVENT_AFTER_RENDER]事件是否有处理函数 //实例化ViewEvent $event = new ViewEvent([ 'viewFile' => $viewFile, 'params' => $params, 'output' => $output, ]); //触发[EVENT_AFTER_RENDER]事件 $this->trigger(self::EVENT_AFTER_RENDER, $event); $output = $event->output;//执行后置事件后的输出结果 } } /** * Renders a view file as a PHP script. * 将一个view文件当作PHP脚本渲染 * This method treats the view file as a PHP script and includes the file. * It extracts the given parameters and makes them available in the view file. * The method captures the output of the included view file and returns it as a string. * 将传入的参数转换为变量,包含并执行view文件,返回执行结果 * This method should mainly be called by view renderer or [[renderFile()]]. * * @param string $_file_ the view file. * @param array $_params_ the parameters (name-value pairs) that will be extracted and made available in the view file. * @return string the rendering result */ public function renderPhpFile($_file_, $_params_ = []) { //ob_start() — 打开输出控制缓冲 ob_start(); // ob_implicit_flush () — 默认为关闭缓冲区,打开绝对输出后,每个脚本输出都直接发送到浏览器,不再需要调用 flush() ob_implicit_flush(false); extract($_params_, EXTR_OVERWRITE);//extract() - 用于将一个数组转换为变量使用,键名为变量名,键值为对应的变量值 require($_file_); //ob_get_clean() — 得到当前缓冲区的内容并删除当前输出缓 return ob_get_clean(); } /** * Renders dynamic content returned by the given PHP statements. * 渲染动态内容 * This method is mainly used together with content caching (fragment caching and page caching) * 该方法主要用来聚合缓存的内容(片段缓存和页面缓存) * when some portions of the content (called *dynamic content*) should not be cached. * The dynamic content must be returned by some PHP statements. * 用来渲染某些被PHP语句返回的动态内容 * @param string $statements the PHP statements for generating the dynamic content. * @return string the placeholder of the dynamic content, or the dynamic content if there is no * active content cache currently. */ public function renderDynamic($statements) { if (!empty($this->cacheStack)) {//动态内容的栈列表不为空 $n = count($this->dynamicPlaceholders);//计算动态内容条数 $placeholder = "<![CDATA[YII-DYNAMIC-$n]]>";//生成占位符--动态内容前缀--起标记作用 $this->addDynamicPlaceholder($placeholder, $statements);//添加动态内容占位符 return $placeholder; } else { return $this->evaluateDynamicContent($statements);//动态内容的栈列表为空,值行传入的PHP语句,返回执行结果 } } /** * Adds a placeholder for dynamic content. * 给dynamic content添加一个占位符 * This method is internally used. * 该方法是内部使用的 * @param string $placeholder the placeholder name * @param string $statements the PHP statements for generating the dynamic content */ public function addDynamicPlaceholder($placeholder, $statements) { foreach ($this->cacheStack as $cache) { $cache->dynamicPlaceholders[$placeholder] = $statements;//给widget中的[FragmentCache]添加占位符 } $this->dynamicPlaceholders[$placeholder] = $statements;//给当前视图添加动态内容占位符 } /** * Evaluates the given PHP statements. * 求给定的PHP语句的值 * This method is mainly used internally to implement dynamic content feature. * 该方法是内部使用实现动态内容功能 * @param string $statements the PHP statements to be evaluated. * @return mixed the return value of the PHP statements. */ public function evaluateDynamicContent($statements) { return eval($statements);//eval() 函数用于执行文本方式输入的php语句 }
GitHub地址: https://github.com/mogambos/yii-2.0.7/blob/master/vendor/yiisoft/yii2/base/View.php
Yii源码阅读笔记(十九)的更多相关文章
- Yii源码阅读笔记(九)
Behvaior类,Behavior类是所有事件类的基类: namespace yii\base; /** * Behavior is the base class for all behavior ...
- Yii源码阅读笔记(一)
今天开始阅读yii2的源码,想深入了解一下yii框架的工作原理,同时学习一下优秀的编码规范和风格.在此记录一下阅读中的小心得. 每个框架都有一个入口文件,首先从入口文件开始,yii2的入口文件位于we ...
- Yii源码阅读笔记(二十九)
动态模型DynamicModel类,用于实现模型内数据验证: namespace yii\base; use yii\validators\Validator; /** * DynamicModel ...
- Yii源码阅读笔记(三十五)
Container,用于动态地创建.注入依赖单元,映射依赖关系等功能,减少了许多代码量,降低代码耦合程度,提高项目的可维护性. namespace yii\di; use ReflectionClas ...
- Yii源码阅读笔记(三十四)
Instance类, 表示依赖注入容器或服务定位器中对某一个对象的引用 namespace yii\di; use Yii; use yii\base\InvalidConfigException; ...
- Yii源码阅读笔记(三十二)
web/Application类的注释,继承base/Application类,针对web应用的一些处理: namespace yii\web; use Yii; use yii\base\Inval ...
- Yii源码阅读笔记(三十)
Widget类是所有小部件的基类,开始,结束和渲染小部件内容的方法的注释: namespace yii\base; use Yii; use ReflectionClass; /** * Widget ...
- Yii源码阅读笔记(二十八)
Yii/web中的Controller类,实现参数绑定,启动csrf验证功能,重定向页面功能: namespace yii\web; use Yii; use yii\base\InlineActio ...
- Yii源码阅读笔记(二十六)
Application 类中设置路径的方法和调用ServiceLocator(服务定位器)加载运行时的组件的方法注释: /** * Handles the specified request. * 处 ...
随机推荐
- cut mysqladmin
[root@86 ~]# mysqladmin -uroot -p123456 -S /tmp/mysql.sock status Uptime: 112403 Threads: 17 Questio ...
- Kafka学习笔记(一):概念介绍
Kafka是一个开源的,分布式的,高吞吐量的消息系统.随着Kafka的版本迭代,日趋成熟.大家对它的使用也逐步从日志系统衍生到其他关键业务领域.特别是其超高吞吐量的特性,在互联网领域,使用越来越广泛, ...
- 深入浅出TCP协议的三次握手过程
TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 每一次TCP连接都需要三个阶段:连接建立.数据传送和连接释放.“三次握手”就发生在连接建立阶段. 1.三次握手( ...
- Xamarin.Android开发实践(十五)
Xamarin.Android学习之应用程序首选项 一.前言 任何App都会存在设置界面,如果开发者利用普通控件并绑定监听事件保存设置,这 一过程会非常的枯燥,而且耗时.我们可以看到Android系统 ...
- vijos 1038 括号+路径 ***
链接:点我 就是自己写不出来 #include <cstdio> #include <climits> #include <memory.h> using name ...
- Visual Studio 2015和ASP.NET 5中可用的前端开发工具集
最近微软发布了一本白皮书,谈到了一些可以和Visual Studio 2015和ASP.NET 5配合使用的JS/前端Web开发工具(比如:函数库.任务执行器.框架等). 由于现在前端开发的生态系统在 ...
- struts2文件上传类型的过滤
转自:http://www.2cto.com/kf/201403/282787.html 第一种解决方案: 1.手动实现文件过滤: 判断上传的文件是否在允许的范围内定义该Action允许上传的文件类型 ...
- 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四)码农网
17. 安装 Webmin Webmin 是基于 Web 的 Linux 配置工具.它像一个中央系统,用于配置各种系统设置,比如用户.磁盘分配.服务以及 HTTP 服务器.Apache.MySQL 等 ...
- ember.js:使用笔记4 数组数据的分组显示
除了之前介绍的将数组数据在一个页面中输出的方法,还可以将数组数据分组,按照点击,在不同页面中分别显示,方法为: Model: 例如:Table Router: 设置一个父对象和子对象设置: this. ...
- Xamarin环境搭建
Xamarin的环境搭建 Xamarin在osx下面的环境搭建包括开发者帐号申请,下载安装Xamarin以及Xcode,以及Xamarin Studio上编写第一个应用程序.Xamarin是一个跨平台 ...