Yii源码阅读笔记(四)
所有控制器action的基类yii\base\Action.php
namespace yii\base;//定义的命名空间
use Yii //使用的命名空间
class Action extends Component //继承了组建类
{
//定义属性action的id
public $id;
public $controller; //定义拥有该action的控制器属性
public function __construct($id, $controller, $config = [])//构造函数,用于初始化id和controller属性
{
$this->id = $id;
$this->controller = $controller;
parent::__construct($config);
}
//通过调用控制器中的同名方法,
public function getUniqueId()
{
return $this->controller->getUniqueId() . '/' . $this->id;
}
//用指定的参数运行此操作
public function runWithParams($params)
{
if (!method_exists($this, 'run')) {//如果类中的run方法是不存在
throw new InvalidConfigException(get_class($this) . ' must define a "run()" method.');//抛出异常
}
$args = $this->controller->bindActionParams($this, $params);//控制器的方法,绑定参数
Yii::trace('Running action: ' . get_class($this) . '::run()', __METHOD__);//输出trace信息
if (Yii::$app->requestedParams === null) { //如果Yii::$app的属性requestedParams(操作请求的参数)为空
Yii::$app->requestedParams = $args;//该参数的值为上面绑定参数的返回值
}
if ($this->beforeRun()) {//beforRun方法,默认返回true,意思为run前
$result = call_user_func_array([$this, 'run'], $args);//把$args作为参数来调用当前控制器的run方法
$this->afterRun();//空方法
return $result;//返回函数的调用结果,如出错,返回false
} else {
return null;//否则返回空
}
}
protected function beforeRun()//该方法在run之前执行,调用时重写该方法,如果返回为false,则run方法不执行,runwithparams方法返回空
{
return true;
}
//该方法在run方法后执行,用于处理后续操作
protected function afterRun()
{
}
}
component.php组件类
class Component extends Object //继承了object类
{
private $_events = [];//私有的events属性
private $_behaviors;//私有的behaviors属性
public function __get($name)//__get魔术方法,用于返回组组件的属性值
{
$getter = 'get' . $name;//通过连字符构建该属性的get方法名
if (method_exists($this, $getter)) {//如果该方法存在
// read property, e.g. getName()
return $this->$getter();//调用该方法获取属性
} else {
// behavior property
$this->ensureBehaviors();//调用ensureBehaviors()方法确定该行为类中定义了该属性
foreach ($this->_behaviors as $behavior) {
if ($behavior->canGetProperty($name)) {//如果该行为类可以获取属性
return $behavior->$name;//返回该行为类的属性值
}
}
}
if (method_exists($this, 'set' . $name)) {//如果该属性名的set方法存在抛出异常
throw new InvalidCallException('Getting write-only property: ' . get_class($this) . '::' . $name);
} else {//否则抛出异常,未知的属性
throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name);
}
}
component的__set方法
public function __set($name, $value)
{
$setter = 'set' . $name;//在属性名前面加set构建set方法
if (method_exists($this, $setter)) {//如果构建的方法存在
// 调用该方法设置属性值
$this->$setter($value);
return;
} elseif (strncmp($name, 'on ', 3) === 0) {//如果方法不存在,且属性名前三个字符为on+空格
// on event: attach event handler
$this->on(trim(substr($name, 3)), $value);//调用on方法将事件处理程序附加到事件
return;
} elseif (strncmp($name, 'as ', 3) === 0) {//否则,如果属性名的前三个字符为as+空格
// as behavior: attach behavior
$name = trim(substr($name, 3));//截取as后面的字符
$this->attachBehavior($name, $value instanceof Behavior ? $value : Yii::createObject($value));//嗲用attachBehavior添加一个行为到组件
return;
} else {//否则
// behavior property
$this->ensureBehaviors();//调用ensureBehaviors()方法确定该行为类中定义了该属性
foreach ($this->_behaviors as $behavior) {
if ($behavior->canSetProperty($name)) {//调用方法判断该属性是否口试被赋值
$behavior->$name = $value;//给该行为类的属性赋值
return;
}
}
}
if (method_exists($this, 'get' . $name)) {//如果该属性的get方法存在,抛出异常
throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name);
} else {//否则抛出异常,未知的属性
throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name);
}
}
Yii源码阅读笔记(四)的更多相关文章
- Yii源码阅读笔记(一)
今天开始阅读yii2的源码,想深入了解一下yii框架的工作原理,同时学习一下优秀的编码规范和风格.在此记录一下阅读中的小心得. 每个框架都有一个入口文件,首先从入口文件开始,yii2的入口文件位于we ...
- Werkzeug源码阅读笔记(四)
今天主要讲一下werkzeug中的routing模块.这个模块是werkzeug中的重点模块,Flask中的路由相关的操作使用的都是这个模块 routing模块的用法 在讲解模块的源码之前,先讲讲这个 ...
- Yii源码阅读笔记(三十四)
Instance类, 表示依赖注入容器或服务定位器中对某一个对象的引用 namespace yii\di; use Yii; use yii\base\InvalidConfigException; ...
- Yii源码阅读笔记(二十四)
Module类中获取子模块,注册子模块,实例化控制器,根据路由运行指定控制器方法的注释: /** * Retrieves the child module of the specified ID. * ...
- Yii源码阅读笔记(十四)
Model类,集中整个应用的数据和业务逻辑——场景.属性和标签: /** * Returns a list of scenarios and the corresponding active attr ...
- Yii源码阅读笔记(二)
接下来阅读BaseYii.php vendor/yiisoft/yii2/BaseYii.php—— namespace yii; use yii\base\InvalidConfigExceptio ...
- Yii源码阅读笔记(八)
前面阅读了Yii2的两个基本类Object和Component,了解了Yii的三个重要概念属性.事件.行为,下面开始阅读Event类,Event类是所有事件类的基类: <?php /** * @ ...
- Yii源码阅读笔记(三)
接着上次的继续阅读BaseYii.php vendor/yiisoft/yii2/BaseYii.php—— public static function getRootAlias($alias)// ...
- Yii源码阅读笔记(三十五)
Container,用于动态地创建.注入依赖单元,映射依赖关系等功能,减少了许多代码量,降低代码耦合程度,提高项目的可维护性. namespace yii\di; use ReflectionClas ...
随机推荐
- CI中REST URL含有中文怎么处理(报错:The URI you submitted has disallowed characters)
解决方法: 客户端在发送GET URL请求的时候,将含有中文的URL编码即可 比如: 原始:http://localhost/qk/rest/user_album_api/get_user_album ...
- php动态安装mongo扩展
首先下载mongo扩展包 http://pecl.php.net/package/mongo 开始安装把 wget http://pecl.php.net/get/mongo-1.5.8.tgz t ...
- 《数学之美》(吴军 著)读书笔记:第1章 文字和语言 vs 数字和信息
第1章有4个小节,以及前言. 前言 1.信息 2.文字和数字 3.文字和语言背后的数学 4.小结 下面我一一展开,让我们看看每一节都说了什么. 前言 语言和数字都是信息传播的载体,他们之间其实存在着天 ...
- poj 1753
翻转棋,注意是翻转周围四个的,不是整行列的 汗-_-! 哥的代码风还是不错的 二进制储存状态 Sample Input bwwb bbwb bwwb bwww Sample Output 4 #in ...
- more命令
more 命令 用于分屏显示 more命令一般用于显示内容超过一屏的文件.其他命令经常和more匹配使用,但more命令也客单独使用. (1)其他命令和more命令匹配使用: 格式: 其他命令格 ...
- .Net AppDomain.CurrentDomain.AppendPrivatePath(@"Libs");
今天就说说.Net中通过反射取得某个类型时,我们怎么知道这个类型在硬盘上的哪个角落?比如说,假如我们需要要求服务端动态载入某个数据源,那服务端怎么知道数据源在哪?网上大部分的教程都写着,可以使用Ass ...
- 手持PDA智能条码扫描RFID打印POS机
手持PDA智能条码扫描RFID打印POS机 一.系统稳定性: 1.硬件稳定性: 采用了华为海思(国内唯一可以媲美全球顶级的CPU+射频方案厂商,可以和英伟达等一决高下)手机方案,CPU+射频浑然一 ...
- HDU1561 The more, The Better(树形DP)
题目是有n个存有宝藏的城堡,攻克任何一个城堡都需要先攻克0个或其他1个城堡,问攻克m个城堡最多能得到多少宝藏. 题目给的城堡形成一个森林,添加一个超级根把森林连在一起就是树了,那么就考虑用树型DP: ...
- DevExpress DXperience 的ASPxFilterControl 不显示 Like 菜单的方法
当使用Linq 作为数据源时,如果使用 ASPxFilterControl 的 Like 菜单筛选数据,就会出现以下错误 LINQ to Entities does not recognize the ...
- 排列组合[HDU1521]
排列组合 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...