Yii2 的生命周期

整体生命周期

  1. 用户的请求被指向入库文件,开启生命周期

  2. 入口脚本会加载配置,然后创建一个application实例

  3. application进行路由操作,既根据url寻找目标控制器

  4. application创建一个目标controller

  5. 控制器会创建一个action实例,并为该动作执行相关的Filters

  6. 如果任何一个过滤器验证失败,该动作会被取消

  7. 如果全部的过滤器都通过,该动作就会被执行

  8. 动作加载相关的一个或多个数据模型

  9. 动作渲染View

  10. 渲染得到的结果会返回给response应用组件

  11. 响应组件会把渲染结果返回给请求者,生命周期结束


备注:

在2步的时候 一些系统应用组件 或 配置的应用组件会启动,如果是API 那么第9步可能就不会用到了


主体应用生命周期

当运行 入口脚本 处理请求时, 应用主体会经历以下生命周期:

入口脚本加载应用主体配置数组。

入口脚本创建一个应用主体实例:

调用 preInit() 配置几个高级别应用主体属性, 比如 basePath。

注册 error handler 错误处理方法。

配置应用主体属性。

调用 init() 初始化,该函数会调用 bootstrap() 运行引导启动组件。

入口脚本调用 yii\base\Application::run() 运行应用主体:

触发 EVENT_BEFORE_REQUEST 事件。

处理请求:解析请求 路由 和相关参数; 创建路由指定的模块、控制器和动作对应的类,并运行动作。

触发 EVENT_AFTER_REQUEST 事件。

发送响应到终端用户。

入口脚本接收应用主体传来的退出状态并完成请求的处理。


控制器Controller内生命周期


在控制器创建和配置后,yii\base\Controller::init() 方法会被调用。 (因为控制器的基类需要__constuct()方法做一些初始化的工作(比如初始化模板引擎),如果你在控制器里实现了__construct,你还需要在__construct里调用parent::__construct()就太麻烦了。
所以通常会在基类里定义一个空的init方法,并且在__construct里(通常是末尾)调用$this->init(),这样开发的时候就只需要实现init方法


控制器根据请求操作ID创建一个操作对象: 如果操作ID没有指定,会使用yii\base\Controller::defaultAction默认操作ID; 


如果在yii\base\Controller::actions()找到操作ID,会创建一个独立操作; 


如果操作ID对应操作方法,会创建一个内联操作; 否则会抛出yii\base\InvalidRouteException异常。


 控制器按顺序调用应用主体、模块(如果控制器属于模块)、控制器的 beforeAction() 方法

 如果任意一个调用返回false,后面未调用的beforeAction()会跳过并且操作执行会被取消;

 

action execution will be cancelled. 默认情况下每个 beforeAction() 方法会触发一个 beforeAction 事件,在事件中你可以追加事件处理操作; 


控制器执行操作: 请求数据解析和填入到操作参数;


控制器按顺序调用控制器、模块(如果控制器属于模块)、应用主体的 afterAction() 方法; 

默认情况下每个 afterAction() 方法会触发一个 afterAction 事件,在事件中你可以追加事件处理操作;


应用主体获取操作结果并赋值给响应



 ActiveRecord的生命周期


当你实例化一个新的AR对象时,我们将获得如下的生命周期:

constructor

yii\db\ActiveRecord::init(): 会触发一个 yii\db\ActiveRecord::EVENT_INIT 事件


当你通过 yii\db\ActiveRecord::find() 方法查询数据时,每个AR实例都将有以下生命周期:

constructor

yii\db\ActiveRecord::init(): 会触发一个 yii\db\ActiveRecord::EVENT_INIT 事件

yii\db\ActiveRecord::afterFind(): 会触发一个 yii\db\ActiveRecord::EVENT_AFTER_FIND 事件


当通过 yii\db\ActiveRecord::save() 方法写入或者更新数据时, 我们将获得如下生命周期:

yii\db\ActiveRecord::beforeValidate(): 会触发一个 yii\db\ActiveRecord::EVENT_BEFORE_VALIDATE 事件

yii\db\ActiveRecord::afterValidate(): 会触发一个 yii\db\ActiveRecord::EVENT_AFTER_VALIDATE 事件

yii\db\ActiveRecord::beforeSave(): 会触发一个 yii\db\ActiveRecord::EVENT_BEFORE_INSERT 或 yii\db\ActiveRecord::EVENT_BEFORE_UPDATE 事件

执行实际的数据写入或更新

yii\db\ActiveRecord::afterSave(): 会触发一个 yii\db\ActiveRecord::EVENT_AFTER_INSERT 或 yii\db\ActiveRecord::EVENT_AFTER_UPDATE 事件


当调用 yii\db\ActiveRecord::delete() 删除数据时, 我们将获得如下生命周期:

yii\db\ActiveRecord::beforeDelete(): 会触发一个 yii\db\ActiveRecord::EVENT_BEFORE_DELETE 事件

执行实际的数据删除

yii\db\ActiveRecord::afterDelete(): 会触发一个 yii\db\ActiveRecord::EVENT_AFTER_DELETE 事件