首先我们看一份生命周期图
Yii启动请求流程
入口脚本加载主体配置(index.php)
— 项目启动执行入口文件, 加载config数组, 实例化Application1
2
3
4
5
6
7
8
9
10
11<?php
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
require __DIR__ . '/../vendor/autoload.php';
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';
$config = require __DIR__ . '/../config/web.php';
(new yii\web\Application($config))->run();入口脚本new Application() 执行构造函数
— yii\web\Application 继承yii\base\Application, 执行父类构造函数1
2
3
4
5
6
7
8
9
10
11
12
13public function __construct($config = [])
{
Yii::$app = $this;
static::setInstance($this);
$this->state = self::STATE_BEGIN;
$this->preInit($config);
$this->registerErrorHandler($config);
Component::__construct($config);
}- static::setInstance($this); 加载当前模块app
- $this->preInit($config); 会设置一下基本配置 例如basePath, vendorPath, runtimePath, 设置container(依赖)设置核心组件coreComponent.
- $this->registerErrorHandler($config); 注册错误处理组件, 但是核心组件是yii默认开启的,没有在config中配置,也同样起作用
Component::__construct($config); 组件实例化 执行Yii::configure($this, $config)
component.php 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16public function __construct($config = [])
{
if (!empty($config)) {
Yii::configure($this, $config);
}
$this->init();
}
// BaseObject.php
public static function configure($object, $properties)
{
foreach ($properties as $name => $value) {
$object->$name = $value;
}
return $object;
}执行Application::init(), 初始化,该函数会调用 yii\base\Application::bootstrap()
入口脚本执行run()方法, 运行主体
- 触发 [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_BEFORE_REQUEST]] 事件。
- 处理请求:解析请求 路由 和相关参数;创建路由指定的模块、控制器和动作对应的类,并运行动作。
- 触发 [[yii\base\Application::EVENT_AFTER_REQUEST|EVENT_AFTER_REQUEST]] 事件。
- 发送响应到终端用户.
入口脚本接收应用主体传来的退出状态($response->exitStatus)并完成请求的处理。