1. 设置环境
2. 加载自动加载
3. 引入Web需要的配置
4. 运行应用Application
1 <?php 2 3 // comment out the following two lines when deployed to production 4 defined(‘YII_DEBUG‘) or define(‘YII_DEBUG‘, true); 5 defined(‘YII_ENV‘) or define(‘YII_ENV‘, ‘dev‘); 6 7 require __DIR__ . ‘/../vendor/autoload.php‘; 8 require __DIR__ . ‘/../vendor/yiisoft/yii2/Yii.php‘; 9 10 $config = require __DIR__ . ‘/../config/web.php‘; 11 12 (new yii\web\Application($config))->run();
a. 设置全局应用对象:Yii::$app
b. 加载配置,检查配置是否正常配置并设置全局配置参数:如,检查应用id是否设置,检查basePath是否设置,检查缓存目录...,并设置对应的应用属性参数
c. 注册全局错误异常处理机制
d. 设置配置中对应对象的属性
189 /** 190 * Constructor. 191 * @param array $config name-value pairs that will be used to initialize the object properties. 192 * Note that the configuration must contain both [[id]] and [[basePath]]. 193 * @throws InvalidConfigException if either [[id]] or [[basePath]] configuration is missing. 194 */ 195 public function __construct($config = []) 196 { 197 Yii::$app = $this; 198 static::setInstance($this); 199 200 $this->state = self::STATE_BEGIN; 201 202 $this->preInit($config); 203 204 $this->registerErrorHandler($config); 205 206 Component::__construct($config); 207 }
a. 注册Yii扩展的组件,组件目录位于:根目录\vendor\yiisoft\extension/php
b. 注册用户自定义配置文件main.php中属性boostrap配置的容器配置
267 /** 268 * {@inheritdoc} 269 */ 270 public function init() 271 { 272 $this->state = self::STATE_INIT; 273 $this->bootstrap(); 274 }
374 /** 375 * Runs the application. 376 * This is the main entrance of an application. 377 * @return int the exit status (0 means normal, non-zero values mean abnormal) 378 */ 379 public function run() 380 { 381 try { 382 $this->state = self::STATE_BEFORE_REQUEST; 383 $this->trigger(self::EVENT_BEFORE_REQUEST); 384 385 $this->state = self::STATE_HANDLING_REQUEST; 386 $response = $this->handleRequest($this->getRequest()); 387 388 $this->state = self::STATE_AFTER_REQUEST; 389 $this->trigger(self::EVENT_AFTER_REQUEST); 390 391 $this->state = self::STATE_SENDING_RESPONSE; 392 $response->send(); 393 394 $this->state = self::STATE_END; 395 396 return $response->exitStatus; 397 } catch (ExitException $e) { 398 $this->end($e->statusCode, isset($response) ? $response : null); 399 return $e->statusCode; 400 } 401 }
1. 获取请求并传递给handRequest处理请求方法,handleRequest方法位于:\vendor\yiisoft\yii2\web\Application文件中
2. Application文件第80-99行,解析请求URL地址,获取请求路径,地址参数:82行 list($route, $params) = $request->resolve();
3. Application文件第100-116行,根据请求路径及参数,创建路径指向的路由控制器文件,执行方法并传入参数:103行 $result = $this->runAction($route, $params);
a. \vendor\yiisoft\yii2\base\Module::runAction($route, $params),找到路由文件地址:522行 $parts = $this->createController($route)
b. 分析路由控制器,及请求方法:list($controller, $actionID) = $parts
c. 设置全局控制器
d. 执行控制器中的方法体并传入参数:528行 $result = $controller->runAction($actionID, $params)
I. \vendor\yiisoft\yii2\base\Controller::runAction($id, $params = []),第126-138行,方法体创建过程
i. 创建方法体对象:创建方法体对象 第219行 createAction($id)
ii. 正则匹配请求方法名是否符合规范
iii. 方法名转化,以‘-‘切割,转换大小写
iiii. 为方法名添加‘action‘前缀
iiiii. 验证该方法名是否存在该类中
iiiiii. 检查该方法是否属于公共方法
iiiiiii. 执行方法体前
II. 执行模块前置行为(全局行为处理)
III. 执行方法体前置行为(这里可验证方法权限、参数、跨域等行为)
IIII. 执行方法体【业务逻辑,这里就是我们编写代码逻辑controller::action】
IIIII. 执行方法体后置行为(这里可对返回数据进行验证处理)
IIIIII. 执行模块后置行为(全局行为处理)
IIIIIII. 获取以上执行方法体以及模块行为事件处理的最终结果并返回:第172行
1. 解析地址,以‘/‘切割,根据route路由地址解析出id模块以及操作控制器路由地址route 第564-579行
2. 加载模块id对应的模块配置 第582-589行
3. 根据控制器路由地址,加载控制器文件 第591-602行,主要代码:$controller = $this->createControllerByID($id . ‘/‘, $route) 598行
a. 检查类文件及类前缀路径是否符合规范 vendor\yiisoft\base\Module::629行
b. 加载模块完,加载控制器,检查类文件是否存在,控制器地址文件不存在则报错404
c. 加载容器的时候,自动给方法加上controller vendor\yiisoft\base\Module.php::635行
d. 匹配正确的文件,实例化控制器 vendor\yiisoft\base\Module.php::642行
4. 返回对应的类实例化及操作方法到执行前创建控制器 vendor\yiisoft\yii2\base\Module::522行
5. 检查返回是否符合数组(控制器实例及操作方法),否:页面找不到
6. 设置App应用全局控制器 vendor\yiisoft\yii2\base\Module::527行
7. 传递参数到控制器并执行控制器方法 vendor\yiisoft\yii2\base\Module::528行
原文:https://www.cnblogs.com/will-xz/p/13543823.html