[关闭]
@a5635268 2016-02-06T21:09:40.000000Z 字数 1921 阅读 1366

Yii框架之运行流程分析

源码分析与使用笔记


入口脚本

  1. // 定义全局常量
  2. defined('YII_DEBUG') or define('YII_DEBUG', true);
  3. defined('YII_ENV') or define('YII_ENV', 'dev');
  4. // 注册 Composer 自动加载器
  5. require(__DIR__ . '/../vendor/autoload.php');
  6. // 包含 Yii 类文件(baseYII),注册autoloader方法,Yii::$classMap 和 Yii::$container 赋值;
  7. require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
  8. // 加载应用配置
  9. $config = require(__DIR__ . '/../config/web.php');
  10. //创建、配置、运行一个应用
  11. (new yii\web\Application($config))->run();
  12. /*
  13. Application::__construct:
  14. 1.Yii::$app = $this;
  15. 2.Yii::$app->loadedModules[get_class($instance)] = $instance;
  16. 3.解析各项配置项,然后加载核心组件。
  17. 4.$this->registerErrorHandler($config); 定义错误机制,根据常量 YII_ENABLE_ERROR_HANDLER 来决定是否应用YII自身的错误机制
  18. 5.Component::__construct($config);
  19. */
  20. /*
  21. Component::__construct($config):
  22. 1.Component::__construct($config)其实是属于后期静态绑定,调用父类Object的__construct,并且通过
  23. 2.Yii::configure($this, $config); BASEYII里面的,把当前配置全部对应Yii实例里面的相关key属性
  24. 3.$this->init(); 其子类的__construct都会预先被调用
  25. */

run()

  1. $this->state = self::STATE_BEFORE_REQUEST;
  2. $this->trigger(self::EVENT_BEFORE_REQUEST);
  3. $this->state = self::STATE_HANDLING_REQUEST;
  4. $response = $this->handleRequest($this->getRequest());
  5. $this->state = self::STATE_AFTER_REQUEST;
  6. $this->trigger(self::EVENT_AFTER_REQUEST);
  7. $this->state = self::STATE_SENDING_RESPONSE;
  8. $response->send();
  9. $this->state = self::STATE_END;
  10. return $response->exitStatus;
  11. ////获得$response对象
  12. $this->handleRequest($this->getRequest());
  13. $this->getRequest();//获取request组件
  14. $this->get('request');//通过服务定位器获取request组件,
  15. // 'request'组件以及其他的components组件都是通过set写进去的,而set是通过setComponents循环调用的,而setComponents是通过魔术方法__set调用的,但是这里有个问题,就是__set调用的其实是setcomponents方法,大小写有区别为什么还能调用成功;我看了相关的__call方法是没这步执行的;
  16. //最终的控制器操作调用handleRequest();
  17. // $rocute 就是 r参数;
  18. $result = $this->runAction($route, $params);
  19. //send执行了以下事件
  20. function send()
  21. {
  22. if ($this->isSent) {
  23. return;
  24. }
  25. $this->trigger(self::EVENT_BEFORE_SEND);
  26. $this->prepare();
  27. $this->trigger(self::EVENT_AFTER_PREPARE); //数据准备
  28. $this->sendHeaders(); //设置请求头
  29. $this->sendContent(); //输出内容
  30. $this->trigger(self::EVENT_AFTER_SEND);
  31. $this->isSent = true;
  32. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注