View中的查找视图文件方法和渲染文件方法

     /**
      * Finds the view file based on the given view name.
      * 通过view文件名查找view文件
      * @param string $view the view name or the path alias of the view file. Please refer to [[render()]]
      * on how to specify this parameter.
      * @param string $view 视图文件名
      * @param object $context the context to be assigned to the view and can later be accessed via [[context]]
      * in the view. If the context implements [[ViewContextInterface]], it may also be used to locate
      * the view file corresponding to a relative view name.
      * @param object $context 情景
      * @return string the view file path. Note that the file may not exist.
      * @return string view文件路径
      * @throws InvalidCallException if a relative view name is given while there is no active context to
      * determine the corresponding view file.
      */
     protected function findViewFile($view, $context = null)
     {
         if (strncmp($view, '@', 1) === 0) {//判断$view是否是别名路径
             // e.g. "@app/views/main"
             $file = Yii::getAlias($view);//调用getAlias()方法获取真实路径
         } elseif (strncmp($view, '//', 2) === 0) {//判断$view是否以'//'开始
             // e.g. "//layouts/main"
             //调用getViewPath()方法在当前模块下查找视图文件目录路径,然后拼接文件名合成视图文件路径
             $file = Yii::$app->getViewPath() . DIRECTORY_SEPARATOR . ltrim($view, '/');
         } elseif (strncmp($view, '/', 1) === 0) {//判断$view是否以 '/'开始
             // e.g. "/site/index"
             if (Yii::$app->controller !== null) {//且控制器存在
                 //则调用getViewPath()查找当前控制器对应的视图文件目录,然后拼接文件名合成视图文件路径
                 $file = Yii::$app->controller->module->getViewPath() . DIRECTORY_SEPARATOR . ltrim($view, '/');
             } else {//否则,抛出异常
                 throw new InvalidCallException("Unable to locate view file for view '$view': no active controller.");
             }
         } elseif ($context instanceof ViewContextInterface) {
             $file = $context->getViewPath() . DIRECTORY_SEPARATOR . $view;
         } elseif (($currentViewFile = $this->getViewFile()) !== false) {
             $file = dirname($currentViewFile) . DIRECTORY_SEPARATOR . $view;
         } else {
             throw new InvalidCallException("Unable to resolve view file for view '$view': no active view context.");
         }

         if (pathinfo($file, PATHINFO_EXTENSION) !== '') {//如果视图文件的扩展名不为空,直接返回扩展名
             return $file;
         }
         $path = $file . '.' . $this->defaultExtension;//给视图文件添加扩展名
         if ($this->defaultExtension !== 'php' && !is_file($path)) {//这里应该是做二次校验,添加扩展名
             $path = $file . '.php';
         }

         return $path;
     }

     /**
      * Renders a view file.
      * 渲染一个view文件
      *
      * If [[theme]] is enabled (not null), it will try to render the themed version of the view file as long
      * as it is available.
      * 如果[theme]可用(即非空),该方法将视图渲染themed version的视图文件直到[theme]不可用
      * The method will call [[FileHelper::localize()]] to localize the view file.
      * 该方法将调用[FileHelper::localize()]方法本地化视图文件
      *
      * If [[renderers|renderer]] is enabled (not null), the method will use it to render the view file.
      * Otherwise, it will simply include the view file as a normal PHP file, capture its output and
      * return it as a string.
      * 如果[renderers|renderer]可用(即非空),该方法将渲染视图文件,否则将把视图文件作为常规的php文件包含进来
      * 捕捉它的输出并将其返回为字符串
      *
      * @param string $viewFile the view file. This can be either an absolute file path or an alias of it.
      * @param array $params the parameters (name-value pairs) that will be extracted and made available in the view file.
      * @param object $context the context that the view should use for rendering the view. If null,
      * existing [[context]] will be used.
      * @return string the rendering result
      * @throws InvalidParamException if the view file does not exist
      */
     public function renderFile($viewFile, $params = [], $context = null)
     {
         $viewFile = Yii::getAlias($viewFile);//调用getAlias()方法处理输入的视图文件名

         if ($this->theme !== null) {
             $viewFile = $this->theme->applyTo($viewFile);//如果theme非空,怎将其应用到视图文件
         }
         if (is_file($viewFile)) {
             $viewFile = FileHelper::localize($viewFile);//调用[FileHelper::localize()]方法本地化视图文件
         } else {//$viewFile不是文件,抛出异常“视图文件不存在”
             throw new InvalidParamException("The view file does not exist: $viewFile");
         }

         $oldContext = $this->context;
         if ($context !== null) {
             $this->context = $context;
         }
         $output = '';
         $this->_viewFiles[] = $viewFile;

         if ($this->beforeRender($viewFile, $params)) {//如果renderFile的前置事件执行成功
             Yii::trace("Rendering view file: $viewFile", __METHOD__);//记录trace信息
             $ext = pathinfo($viewFile, PATHINFO_EXTENSION);//获取视图文件扩展名
             if (isset($this->renderers[$ext])) {//判断视图文件的扩展名是否支持
                 if (is_array($this->renderers[$ext]) || is_string($this->renderers[$ext])) {
                     $this->renderers[$ext] = Yii::createObject($this->renderers[$ext]);
                 }
                 /* @var $renderer ViewRenderer */
                 $renderer = $this->renderers[$ext];//如果支持的,将view渲染器对象赋值给$renderer
                 $output = $renderer->render($this, $viewFile, $params);//渲染视图文件
             } else {//如果视图文件不是支持的类型,则以普通php文件处理
                 $output = $this->renderPhpFile($viewFile, $params);
             }
             $this->afterRender($viewFile, $params, $output);//调用renderFile的后置方法
         }

         array_pop($this->_viewFiles);//删除viewFiles中最后面的一个元素
         $this->context = $oldContext;

         return $output;
     }

Yii源码阅读笔记(十八)的更多相关文章

  1. Yii源码阅读笔记(八)

    前面阅读了Yii2的两个基本类Object和Component,了解了Yii的三个重要概念属性.事件.行为,下面开始阅读Event类,Event类是所有事件类的基类: <?php /** * @ ...

  2. Yii源码阅读笔记(一)

    今天开始阅读yii2的源码,想深入了解一下yii框架的工作原理,同时学习一下优秀的编码规范和风格.在此记录一下阅读中的小心得. 每个框架都有一个入口文件,首先从入口文件开始,yii2的入口文件位于we ...

  3. Yii源码阅读笔记(二十八)

    Yii/web中的Controller类,实现参数绑定,启动csrf验证功能,重定向页面功能: namespace yii\web; use Yii; use yii\base\InlineActio ...

  4. Yii源码阅读笔记(三十五)

    Container,用于动态地创建.注入依赖单元,映射依赖关系等功能,减少了许多代码量,降低代码耦合程度,提高项目的可维护性. namespace yii\di; use ReflectionClas ...

  5. Yii源码阅读笔记(三十四)

    Instance类, 表示依赖注入容器或服务定位器中对某一个对象的引用 namespace yii\di; use Yii; use yii\base\InvalidConfigException; ...

  6. Yii源码阅读笔记(三十二)

    web/Application类的注释,继承base/Application类,针对web应用的一些处理: namespace yii\web; use Yii; use yii\base\Inval ...

  7. Yii源码阅读笔记(三十)

    Widget类是所有小部件的基类,开始,结束和渲染小部件内容的方法的注释: namespace yii\base; use Yii; use ReflectionClass; /** * Widget ...

  8. Yii源码阅读笔记(二十九)

    动态模型DynamicModel类,用于实现模型内数据验证: namespace yii\base; use yii\validators\Validator; /** * DynamicModel ...

  9. Yii源码阅读笔记(二十六)

    Application 类中设置路径的方法和调用ServiceLocator(服务定位器)加载运行时的组件的方法注释: /** * Handles the specified request. * 处 ...

随机推荐

  1. svn 日志版本回滚

    [root@v01 online]# svn diff -r 9:8 Index: index.html =============================================== ...

  2. jquery easy ui 1.3.4 Tree树形菜单(9)

    9.1.创建树形菜单 <ul id="tt" class="easyui-tree"> <li><span>第一级</ ...

  3. javascript二叉树基本功能实现

    都是常用的功能. 删除是最复杂的.. <!DOCTYPE html> <html lang="en"> <head> <meta char ...

  4. wp8 --未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService...匹配的导出

    今天打算用VisualStudio2012做一个js效果页面测试的时候,打开VS2012新建项目,但是并没有像之前那样顺利的创建页面,而是弹出了一个错误窗口. 我的系统是win8专业版 64位 ,同时 ...

  5. C语言位运算详解(转载)

    转载自:http://www.cnblogs.com/911/archive/2008/05/20/1203477.html 位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C ...

  6. Hark的数据结构与算法练习之堆排序

    前言 堆排序我是看了好半天别人的博客才有了理解,然后又费了九牛二虎之力才把代码写出来,我发现我的基础真的很差劲啊……不过自己选的路一定要坚持走下去.我试着把我的理解描述出来,如有不妥之处希望大家可以指 ...

  7. Android Studio导入Fresco

    大概一周之前,Facebook开源了专为Android系统定制的图片下载缓存工具,当天该消息就上了各大技术论坛网站的头条,也成为了各个技术群里讨论的最主要的话题.也就在当天stay4it的QQ群里面就 ...

  8. js:语言精髓笔记11--动态语言特性(1)

    语言:程序最终被表达为数据(结构)和逻辑(算法),命令式和说明式/函数式语言分别从这两方面分类: 动态:在语言陈述时无法确定,必须在计算机执行时才能确定语言关系:JS是完全动态语言,导致其不确定性一般 ...

  9. json学习系列(4)-JSONString对象的optXXX方法的使用

    在JSONObject获取value有多种方法,如果使用 getXxx()类型的方法获取value,如getString("key").如果key不存在的话,这些方法无一例外的都会 ...

  10. 状态压缩 UVALive 6068 The Little Girl who Picks Mushrooms (12长春C)

    题目传送门 题意:采蘑菇.现在采了n座山,共5座山,最后要求有三个篮子的蘑菇量是1024的整数倍,丢掉后一直减1024直到不超过1024 分析:n <= 3时直接1024,否则状压枚举哪三个篮子 ...