@a5635268
2016-02-06T13:09:40.000000Z
字数 1921
阅读 1553
源码分析与使用笔记
// 定义全局常量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;}
