码迷,mamicode.com
首页 > 其他好文 > 详细

Yii源码阅读笔记(十九)

时间:2016-04-28 01:52:16      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

View中渲染view视图文件的前置和后置方法,以及渲染动态内容的方法:

  1   /**
  2      * @return string|boolean the view file currently being rendered. False if no view file is being rendered.
  3      */
  4     public function getViewFile()
  5     {
  6         return end($this->_viewFiles);//返回[_viewFiles]中的最后一个view文件,即默认被渲染的文件
  7     }
  8 
  9     /**
 10      * This method is invoked right before [[renderFile()]] renders a view file.
 11      * Render的前置事件,在执行[renderFile()]方法时被调用,默认触发[[EVENT_BEFORE_RENDER]]事件
 12      * The default implementation will trigger the [[EVENT_BEFORE_RENDER]] event.
 13      * If you override this method, make sure you call the parent implementation first.
 14      * 如果要重写该方法,要确保首先调用父类的同名方法
 15      * @param string $viewFile the view file to be rendered.
 16      * @param array $params the parameter array passed to the [[render()]] method.
 17      * @return boolean whether to continue rendering the view file.
 18      */
 19     public function beforeRender($viewFile, $params)
 20     {
 21         //实例化ViewEvent
 22         $event = new ViewEvent([
 23             ‘viewFile‘ => $viewFile,
 24             ‘params‘ => $params,
 25         ]);
 26         //触发[EVENT_BEFORE_RENDER]事件
 27         $this->trigger(self::EVENT_BEFORE_RENDER, $event);
 28 
 29         return $event->isValid;//返回值可以判断是否继续渲染文件
 30     }
 31 
 32     /**
 33      * This method is invoked right after [[renderFile()]] renders a view file.
 34      * Render的后置事件,在执行[renderFile()]方法后被调用,默认触发[[EVENT_AFTER_RENDER]]事件
 35      * The default implementation will trigger the [[EVENT_AFTER_RENDER]] event.
 36      * If you override this method, make sure you call the parent implementation first.
 37      * 如果要重写该方法,要确保首先调用父类的同名方法
 38      * @param string $viewFile the view file being rendered.
 39      * @param array $params the parameter array passed to the [[render()]] method.
 40      * @param string $output the rendering result of the view file. Updates to this parameter
 41      * will be passed back and returned by [[renderFile()]].
 42      */
 43     public function afterRender($viewFile, $params, &$output)
 44     {
 45         if ($this->hasEventHandlers(self::EVENT_AFTER_RENDER)) {//判断[EVENT_AFTER_RENDER]事件是否有处理函数
 46            //实例化ViewEvent
 47             $event = new ViewEvent([
 48                 ‘viewFile‘ => $viewFile,
 49                 ‘params‘ => $params,
 50                 ‘output‘ => $output,
 51             ]);
 52              //触发[EVENT_AFTER_RENDER]事件
 53             $this->trigger(self::EVENT_AFTER_RENDER, $event);
 54             $output = $event->output;//执行后置事件后的输出结果
 55         }
 56     }
 57 
 58     /**
 59      * Renders a view file as a PHP script.
 60      * 将一个view文件当作PHP脚本渲染
 61      * This method treats the view file as a PHP script and includes the file.
 62      * It extracts the given parameters and makes them available in the view file.
 63      * The method captures the output of the included view file and returns it as a string.
 64      * 将传入的参数转换为变量,包含并执行view文件,返回执行结果
 65      * This method should mainly be called by view renderer or [[renderFile()]].
 66      *
 67      * @param string $_file_ the view file.
 68      * @param array $_params_ the parameters (name-value pairs) that will be extracted and made available in the view file.
 69      * @return string the rendering result
 70      */
 71     public function renderPhpFile($_file_, $_params_ = [])
 72     {
 73         //ob_start() — 打开输出控制缓冲
 74         ob_start();
 75         // ob_implicit_flush ()  — 默认为关闭缓冲区,打开绝对输出后,每个脚本输出都直接发送到浏览器,不再需要调用 flush()
 76         ob_implicit_flush(false);
 77         extract($_params_, EXTR_OVERWRITE);//extract() - 用于将一个数组转换为变量使用,键名为变量名,键值为对应的变量值
 78         require($_file_);
 79         //ob_get_clean() — 得到当前缓冲区的内容并删除当前输出缓
 80         return ob_get_clean();
 81     }
 82 
 83     /**
 84      * Renders dynamic content returned by the given PHP statements.
 85      * 渲染动态内容
 86      * This method is mainly used together with content caching (fragment caching and page caching)
 87      * 该方法主要用来聚合缓存的内容(片段缓存和页面缓存)
 88      * when some portions of the content (called *dynamic content*) should not be cached.
 89      * The dynamic content must be returned by some PHP statements.
 90      * 用来渲染某些被PHP语句返回的动态内容
 91      * @param string $statements the PHP statements for generating the dynamic content.
 92      * @return string the placeholder of the dynamic content, or the dynamic content if there is no
 93      * active content cache currently.
 94      */
 95     public function renderDynamic($statements)
 96     {
 97         if (!empty($this->cacheStack)) {//动态内容的栈列表不为空
 98             $n = count($this->dynamicPlaceholders);//计算动态内容条数
 99             $placeholder = "<![CDATA[YII-DYNAMIC-$n]]>";//生成占位符--动态内容前缀--起标记作用
100             $this->addDynamicPlaceholder($placeholder, $statements);//添加动态内容占位符
101 
102             return $placeholder;
103         } else {
104             return $this->evaluateDynamicContent($statements);//动态内容的栈列表为空,值行传入的PHP语句,返回执行结果
105         }
106     }
107 
108     /**
109      * Adds a placeholder for dynamic content.
110      * 给dynamic content添加一个占位符
111      * This method is internally used.
112      * 该方法是内部使用的
113      * @param string $placeholder the placeholder name
114      * @param string $statements the PHP statements for generating the dynamic content
115      */
116     public function addDynamicPlaceholder($placeholder, $statements)
117     {
118         foreach ($this->cacheStack as $cache) {
119             $cache->dynamicPlaceholders[$placeholder] = $statements;//给widget中的[FragmentCache]添加占位符
120         }
121         $this->dynamicPlaceholders[$placeholder] = $statements;//给当前视图添加动态内容占位符
122     }
123 
124     /**
125      * Evaluates the given PHP statements.
126      * 求给定的PHP语句的值
127      * This method is mainly used internally to implement dynamic content feature.
128      * 该方法是内部使用实现动态内容功能
129      * @param string $statements the PHP statements to be evaluated.
130      * @return mixed the return value of the PHP statements.
131      */
132     public function evaluateDynamicContent($statements)
133     {
134         return eval($statements);//eval() 函数用于执行文本方式输入的php语句
135     }

GitHub地址: https://github.com/mogambos/yii-2.0.7/blob/master/vendor/yiisoft/yii2/base/View.php

Yii源码阅读笔记(十九)

标签:

原文地址:http://www.cnblogs.com/isleep/p/5441130.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!