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. * 处 ...
随机推荐
- hdu 1215 筛法
求小于n的n的因子之和 Sample Input 3 2 10 20Sample Output 1 8 22 #include<cstdio> #include<iostream&g ...
- 【现代程序设计】homework-03
Homework-03 队员: 11061193 薛亚杰 11061192 周敏轩 11061190 李孟 0 材料阅读 我们三个人将以下材料仔细阅读,觉得十分受益.下面是我们的总结和分享: 1 ...
- Android Studio 1.0首次安装遇到的问题,无法下载SDK
相信,在安装Android Studio的过程中会遇到很多问题,特别是第一次启动下载不了sdk.郁闷了吧. 可以去官网下载,也可以点击这里下载Android Studio和sdk. 一.不下载SDK启 ...
- Hark的数据结构与算法练习之地精(侏儒)排序
算法说明 地精排序是交换排序的一种,它是冒泡排序的一种改良,我感觉和鸡尾酒排序挺像的. 不同之处是鸡尾酒排序是从小到大,然后再从大到小切换着排序的.而地精排序是上来先从小到大排序,碰到交换到再从大到小 ...
- Oracle创建表空间和表
创建表空间和表ORACLE物理上是由磁盘上的以下几种文件:数据文件和控制文件和LOGFILE构成的oracle中的表就是一张存储数据的表.表空间是逻辑上的划分.方便管理的.数据表空间 (Tablesp ...
- SU Demos-02Filtering-02Subfilt
巴特沃斯滤波器的特点是通频带的频率响应曲线最平滑.这种滤波器最先由英国工程师斯替芬·巴特沃斯(Stephen Butterworth)在1930年发表在英国<无线电工程>期刊的一篇论文中提 ...
- 【随笔】android开发的学习路线
第一阶段:Java面向对象编程 1.Java基本数据类型与表达式,分支循环. 2.String和StringBuffer的使用.正则表达式. 3.面向对象的抽象,封装,继承,多态,类与对象,对象初始化 ...
- BZOJ1109 : [POI2007]堆积木Klo
f[i]表示第i个在自己位置上的最大值 则f[i]=max(f[j])+1 其中 j<i a[j]<a[i] a[i]-a[j]<=i-j -> j-a[j]<=i-a[ ...
- BZOJ3276 : 磁力
按距离建立线段树,维护区间重量最小值 然后跑一遍拓扑,每次将所有能取的加入队尾 #include<cstdio> #include<algorithm> #define N 2 ...
- vnc使用
使用rpm –qa vnc命令如果收到如下信息说明已经安装了vncserver, [root@localhost: ~]#rpm -qa |grep vnc gtk-vnc-python--.el5 ...