Yii源码阅读笔记(十八)
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源码阅读笔记(十八)的更多相关文章
- Yii源码阅读笔记(八)
前面阅读了Yii2的两个基本类Object和Component,了解了Yii的三个重要概念属性.事件.行为,下面开始阅读Event类,Event类是所有事件类的基类: <?php /** * @ ...
- Yii源码阅读笔记(一)
今天开始阅读yii2的源码,想深入了解一下yii框架的工作原理,同时学习一下优秀的编码规范和风格.在此记录一下阅读中的小心得. 每个框架都有一个入口文件,首先从入口文件开始,yii2的入口文件位于we ...
- Yii源码阅读笔记(二十八)
Yii/web中的Controller类,实现参数绑定,启动csrf验证功能,重定向页面功能: namespace yii\web; use Yii; use yii\base\InlineActio ...
- 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源码阅读笔记(二十九)
动态模型DynamicModel类,用于实现模型内数据验证: namespace yii\base; use yii\validators\Validator; /** * DynamicModel ...
- Yii源码阅读笔记(二十六)
Application 类中设置路径的方法和调用ServiceLocator(服务定位器)加载运行时的组件的方法注释: /** * Handles the specified request. * 处 ...
随机推荐
- 基于Lumisoft.NET组件的POP3邮件接收和删除操作(转载)
Lumisoft.NET组件是一个非常强大的邮件发送.邮件接收等功能的开源组件,一般用它来处理邮件的相关操作,是非常合适的.之前也写过一些该组件的随笔文章,不过主要是利用来发送邮件居多,最近由于项目需 ...
- ytu 1041: 迭代法求平方根(水题)
1041: 迭代法求平方根 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 227 Solved: 146[Submit][Status][Web Bo ...
- mac平台下面ruby环境搭建
一.安装xcode 先安装 [Xcode](http://developer.apple.com/xcode/) 开发工具,它将帮你安装好 Unix 环境需要的开发包 二.安装 RVM curl -L ...
- 实现开启和关闭android移动网络(转)
开启和关闭移动数据网络有两种方法:一种是通过操作系统的数据库改变APN(网络接入点),从而实现开启和关闭移动数据网络,另一种是通过反射调用系统(ConnectivityManager)的setMobl ...
- SplendidCRM 如何添加及使用中文语言包
SplendidCRM 功能很强大,也支持多国语言,但关于中文语言安装的介绍在网上一直都找到,自已摸索了一下,成功使SplendidCRM应用中文,以下是安装方法. 版本号:SplendidCRM 7 ...
- 寒冰王座[HDU1248]
寒冰王座 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- 调用WebServiceWebService提示The maximum string content length quota (8192) has been exceeded while reading XML data的解决办法
在web.config中,bindings节点下,对应的服务名称中,原本可能是自动折叠的“/>”,需要改成手动折叠的</binding>,然后在中间加上<readerQuota ...
- Nginx location 匹配规则
1. default_server: 当请求没有匹配到服务器中配置的任何一个server的时候,会默认把请求route到配置了default_server的virtual host中.参考地址:htt ...
- LeetCode-Repeated DNA Sequences (位图算法减少内存)
Repeated DNA Sequences All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, ...
- oracle 存储过程 基础
差不多一年没写过存储过程,最近要写,发现基本忘了,google一番之后,觉得很有必要把基础的东西写下来备忘. 语句块定义: decalre -- 变量声明 var1 ); -- 仅声明 var2 ) ...