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. * 处 ...
随机推荐
- ubuntu 彻底删除卸载
1911 sudo apt-get install zabbix-agent 1916 sudo apt-get autoremove zabbix_agent root@(none):~# apt- ...
- Perl中的正则表达式
转自:http://c20031776.blog.163.com/blog/static/684716252013624383887/ Perl 程序中,正则表达式有三种存在形式 分别是 (1 模式匹 ...
- 基于JQuery实现滚动到页面底端时自动加载更多信息
基于JQuery实现滚动到页面底端时自动加载更多信息 关键代码: 代码如下: var stop=true; $(window).scroll(function(){ totalheight = par ...
- 关于Android开发中的证书和密钥等问题
关于Android开发中的证书和密钥等问题 引言 除了Android发布应用签名时需要用到证书外,在进行google Map Api开发和Facebook SDK API开发等时都需要申请API Ke ...
- NDK编译生成so文件
1 首先加载项目
- matlab练习程序(矩形变换为单连通形状)
变换使用的模板必须是单连通的,而且模板中心必须在模板内,如果在模板中打个结或是月牙形,这里的程序就处理不了了. 虽然非单连通模板也有办法处理,不过不是这里要讨论的. 这里用到的方法和矩形变换为圆那片文 ...
- Codeforces Round #Pi (Div. 2) B. Berland National Library set
B. Berland National LibraryTime Limit: 2 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest ...
- Linux常用命令_(文件搜索)
文件查找主要包含以下几个命令 which.whereis.grep.find.wc
- 不容易系列之(4)——考新郎[HDU2049]
不容易系列之(4)——考新郎 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- BZOJ3836 : [Poi2014]Tourism
对于一个连通块,取一个点进行dfs,得到一棵dfs搜索树,则这棵树的深度不超过10,且所有额外边都是前向边. 对于每个点x,设S为三进制状态,S第i位表示根到x路径上深度为i的点的状态: 0:选了 1 ...