@a5635268
2016-02-06T21:09:40.000000Z
字数 1921
阅读 1366
源码分析与使用笔记
// 定义全局常量
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
// 注册 Composer 自动加载器
require(__DIR__ . '/../vendor/autoload.php');
// 包含 Yii 类文件(baseYII),注册autoloader方法,Yii::$classMap 和 Yii::$container 赋值;
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
// 加载应用配置
$config = require(__DIR__ . '/../config/web.php');
//创建、配置、运行一个应用
(new yii\web\Application($config))->run();
/*
Application::__construct:
1.Yii::$app = $this;
2.Yii::$app->loadedModules[get_class($instance)] = $instance;
3.解析各项配置项,然后加载核心组件。
4.$this->registerErrorHandler($config); 定义错误机制,根据常量 YII_ENABLE_ERROR_HANDLER 来决定是否应用YII自身的错误机制
5.Component::__construct($config);
*/
/*
Component::__construct($config):
1.Component::__construct($config)其实是属于后期静态绑定,调用父类Object的__construct,并且通过
2.Yii::configure($this, $config); BASEYII里面的,把当前配置全部对应Yii实例里面的相关key属性
3.$this->init(); 其子类的__construct都会预先被调用
*/
$this->state = self::STATE_BEFORE_REQUEST;
$this->trigger(self::EVENT_BEFORE_REQUEST);
$this->state = self::STATE_HANDLING_REQUEST;
$response = $this->handleRequest($this->getRequest());
$this->state = self::STATE_AFTER_REQUEST;
$this->trigger(self::EVENT_AFTER_REQUEST);
$this->state = self::STATE_SENDING_RESPONSE;
$response->send();
$this->state = self::STATE_END;
return $response->exitStatus;
////获得$response对象
$this->handleRequest($this->getRequest());
$this->getRequest();//获取request组件
$this->get('request');//通过服务定位器获取request组件,
// 'request'组件以及其他的components组件都是通过set写进去的,而set是通过setComponents循环调用的,而setComponents是通过魔术方法__set调用的,但是这里有个问题,就是__set调用的其实是setcomponents方法,大小写有区别为什么还能调用成功;我看了相关的__call方法是没这步执行的;
//最终的控制器操作调用handleRequest();
// $rocute 就是 r参数;
$result = $this->runAction($route, $params);
//send执行了以下事件
function send()
{
if ($this->isSent) {
return;
}
$this->trigger(self::EVENT_BEFORE_SEND);
$this->prepare();
$this->trigger(self::EVENT_AFTER_PREPARE); //数据准备
$this->sendHeaders(); //设置请求头
$this->sendContent(); //输出内容
$this->trigger(self::EVENT_AFTER_SEND);
$this->isSent = true;
}