整体生命周期
用户的请求被指向入库文件,开启生命周期
入口脚本会加载配置,然后创建一个application实例
application进行路由操作,既根据url寻找目标控制器
application创建一个目标controller
控制器会创建一个action实例,并为该动作执行相关的Filters
如果任何一个过滤器验证失败,该动作会被取消
如果全部的过滤器都通过,该动作就会被执行
动作加载相关的一个或多个数据模型
动作渲染View
渲染得到的结果会返回给response应用组件
响应组件会把渲染结果返回给请求者,生命周期结束
备注:
在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 事件