Yii源码阅读笔记(十)
控制器类,所有控制器的基类,用于调用模型和布局,输出到视图
namespace yii\base;
use Yii;
/**
* Controller is the base class for classes containing controller logic.
* 控制器,是所用控制器类的基类
*
* @property Module[] $modules 只读属性 当前控制器的所有模块
*
* @property string $route (module ID, controller ID and action ID) 当前请求的路径 只读属性 可以获取到请求的路径
*
* @property string $uniqueId 以module ID(如果有的话) 为前缀的controller ID 应该是唯一标识的作用
*
* @property View|\yii\web\View $view 视图 object 用来传递视图或视图文件.
*
* @property string $viewPath 包含当前控制器的视图目录.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0
*/
class Controller extends Component implements ViewContextInterface
{
/**
* @event ActionEvent an event raised right before executing a controller action.
* You may set [[ActionEvent::isValid]] to be false to cancel the action execution.
* 在执行beforeAction方法时触发的事件,如果对事件的isValid属性设置为false,将取消action的执行
*/
const EVENT_BEFORE_ACTION = 'beforeAction';
/**
* @event ActionEvent an event raised right after executing a controller action.
* 在执行afterAction方法是触发的事件
*/
const EVENT_AFTER_ACTION = 'afterAction';
/**
* @var string the ID of this controller.
* 控制器id,
*/
public $id;
/**
* @var Module $module the module that this controller belongs to.
* 所属模块
*/
public $module;
/**
* @var string the ID of the action that is used when the action ID is not specified
* in the request. Defaults to 'index'.
* 控制器中默认动作,默认为index
*/
public $defaultAction = 'index';
/**
* @var string|boolean the name of the layout to be applied to this controller's views.
* This property mainly affects the behavior of [[render()]].
* Defaults to null, meaning the actual layout value should inherit that from [[module]]'s layout value.
* If false, no layout will be applied.
* 布局文件,如果设置为false,则不使用布局文件
*/
public $layout;
/**
* @var Action the action that is currently being executed. This property will be set
* by [[run()]] when it is called by [[Application]] to run an action.
* 当前下面执行的action,可在事件中根据这个action来执行不同的操作
*/
public $action;
/**
* @var View the view object that can be used to render views or view files.
* 视图对象,用来定义输出的视图文件
*/
private $_view;
/**
* @var string the root directory that contains view files for this controller.
*/
private $_viewPath;
/**
* @param string $id 当前控制器的ID
* @param Module $module 当前控制器的模块
* @param array $config 初始化对像时的配置文件
*/
public function __construct($id, $module, $config = [])
{
//初始化指定控制器id,模块,根据配置文件初始化控制器对象
$this->id = $id;
$this->module = $module;
parent::__construct($config);
}
/**
* Declares external actions for the controller.
* 定义action 声明控制器的外部操作
* This method is meant to be overwritten to declare external actions for the controller.
* It should return an array, with array keys being action IDs, and array values the corresponding
* action class names or action configuration arrays. For example,
* 这个用来指定独立的action,返回格式为name-value的数组,name为action的id,value为action类的实现,如:
*
* ```php
* return [
* 'action1' => 'app\components\Action1',
* 'action2' => [
* 'class' => 'app\components\Action2',
* 'property1' => 'value1',
* 'property2' => 'value2',
* ],
* ];
* ```
*
* [[\Yii::createObject()]] will be used later to create the requested action
* using the configuration provided here.
* 这个主要是用于在子类中重写
*/
public function actions()
{
return [];
}
/**
* Runs an action within this controller with the specified action ID and parameters.
* If the action ID is empty, the method will use [[defaultAction]].
* $id 为action的id,也就是操作的名称,如定义的actionIndex,那么id就为Index。
* 如果没有定义 action ID,就会调用默认的操作,例如常用的index
*
* @param string $id 操作id,也就是操作名
* @param array $params the parameters (name-value pairs) to be passed to the action.
* @return mixed the result of the action.
* @throws InvalidRouteException if the requested action ID cannot be resolved into an action successfully.
* @see createAction()
*/
public function runAction($id, $params = [])
{
//创建action
$action = $this->createAction($id);
if ($action === null) {
//创建action失败,抛出异常
throw new InvalidRouteException('Unable to resolve the request: ' . $this->getUniqueId() . '/' . $id);
}
//写入trace信息
Yii::trace('Route to run: ' . $action->getUniqueId(), __METHOD__);
if (Yii::$app->requestedAction === null) {
Yii::$app->requestedAction = $action;//不知道这个是干嘛用的0.0
}
$oldAction = $this->action;//将action中的信息保存到oldAction
$this->action = $action; //将当前的action写入action属性中
//用来保存当前控制器的所有父模块,顺序为由子模块到父模块
$modules = [];
$runAction = true;
/*
* 获取当前控制器的所有的模块,并执行每个模块的beforeAction来检查当前的action是否可以执行,
* 注意:getModules返回的数组顺序为:从父模块到子模块,
* 所以在执行beforeAction的时候,先检查最外层的父模块,然后检查子模块。
*
* 然而在执行afterAction的时候,顺序就反过来了,先执行子模块,最后执行父模块。
*
*/
foreach ($this->getModules() as $module) {
if ($module->beforeAction($action)) {
array_unshift($modules, $module);
} else {
$runAction = false;
break;
}
}
$result = null;
//如果所有的父模块都满足执行的条件
if ($runAction && $this->beforeAction($action)) {//判断当前控制器中beforeAction
// 由生成的action对象来执行runWithParams方法
$result = $action->runWithParams($params);
//执行完后,再执行afterAction方法
$result = $this->afterAction($action, $result);
//执行所有父模块的afterAction
foreach ($modules as $module) {
/* @var $module Module */
$result = $module->afterAction($action, $result);
}
}
$this->action = $oldAction;//有什么用呢?,看完后面的在回头看吧
return $result;
}
Yii源码阅读笔记(十)的更多相关文章
- Yii源码阅读笔记(一)
今天开始阅读yii2的源码,想深入了解一下yii框架的工作原理,同时学习一下优秀的编码规范和风格.在此记录一下阅读中的小心得. 每个框架都有一个入口文件,首先从入口文件开始,yii2的入口文件位于we ...
- 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源码阅读笔记(二十八)
Yii/web中的Controller类,实现参数绑定,启动csrf验证功能,重定向页面功能: namespace yii\web; use Yii; use yii\base\InlineActio ...
- Yii源码阅读笔记(二十六)
Application 类中设置路径的方法和调用ServiceLocator(服务定位器)加载运行时的组件的方法注释: /** * Handles the specified request. * 处 ...
- Yii源码阅读笔记(二十四)
Module类中获取子模块,注册子模块,实例化控制器,根据路由运行指定控制器方法的注释: /** * Retrieves the child module of the specified ID. * ...
- Yii源码阅读笔记(二十二)
Module类,属性的注释和构造函数的注释: <?php /** * @link http://www.yiiframework.com/ * @copyright Copyright (c) ...
随机推荐
- 菜鸟学Linux命令:ssh命令 远程登录
1.查看SSH客户端版本 有的时候需要确认一下SSH客户端及其相应的版本号.使用ssh -V命令可以得到版本号.需要注意的是,Linux一般自带的是OpenSSH: 下面的例子即表明该系统正在使用Op ...
- oracle 卸载步骤(图解)
1.卸载第一步:点击开始菜单: 步骤阅读 2 2.点击Universal Installer来实现下面 步骤阅读 3 3.点击卸载产品后出现的内容: 步骤阅读 4 4.点击打开Oracle主目录下的O ...
- C#学习笔记(九)——集合、比较和转换
一.集合 ** System.Collections名称空间中的几个接口提供了基本的集合功能 Ps:这里看成一个动态的链表,但是已经完美的封装好了. (一)使用集合 1.代码示例 (1)Animal. ...
- SQL Server 2000 ——系统表和系统视图
一.系统表 数据字典的详细信息请查SQL SERVER BOL,这里仅列出一部分. 1.1.sysservers 1.查看所有本地服务器及链接服务器 select * from master..sys ...
- LoadRunner11支持的浏览器小结
LoadRunner11录制脚本时不能打开IE浏览器,解决方案有以下几个步骤: l LoadRunner11支持的浏览器版本最高是ie9,把浏览器版本换成ie9; l 打开IE选项----高级—去 ...
- php升级5.3到5.4,5.5,5.6
Laravel要求php大于5.5.9,升级php5.3.3到5.6.14(最新版为 5.6.15 ) Add EPEL and Remi repositories onto your system: ...
- WCF 超时情形
在做WCF开发时,会经常碰到超时的情况,总结了一下,主要是由一下原因引起: 1.客户端没有正确地Close. 确保每次客户端调用完毕之后,就要调用Close,保证连接数. 另外,服务端配置最大连接数: ...
- 循环多少次?[HDU1799]
循环多少次? Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- 【转】执行脚本出现bin/bash: bad interpreter: No such file or directory
[转自]http://blog.csdn.net/wind19/article/details/4822666 错误原因之一很有可能是你的脚本文件是DOS格式的, 即每一行的行尾以/r/n来标识, 其 ...
- 使用HttpsURLConnection发送POST请求
重写X509TrustManager private static TrustManager myX509TrustManager = new X509TrustManager() { @Overri ...