当运行 入口脚本 处理请求时, 应用主体会经历以下生命周期:
- 入口脚本加载应用主体配置数组。
- 入口脚本创建一个应用主体实例:
- 调用 preInit() 配置几个高级别应用主体属性, 比如 basePath。
- 注册 error handler 错误处理方法.
- 配置应用主体属性.
- 调用 init() 初始化,该函数会调用 bootstrap() 运行引导启动组件.
- 入口脚本调用 yii\base\Application::run() 运行应用主体:
- 触发 EVENT_BEFORE_REQUEST 事件。
- 处理请求:解析请求 路由 和相关参数; 创建路由指定的模块、控制器和动作对应的类,并运行动作。
- 触发 EVENT_AFTER_REQUEST 事件。
- 发送响应到终端用户.
- 入口脚本接收应用主体传来的退出状态并完成请求的处理
控制器生命周期
处理一个请求时,应用主体 会根据请求 路由创建一个控制器, 控制器经过以下生命周期来完成请求:
- 在控制器创建和配置后,yii\base\Controller::init() 方法会被调用。
- 控制器根据请求操作ID创建一个操作对象:
- 如果操作ID没有指定,会使用default action ID默认操作ID;
- 如果在action map找到操作ID, 会创建一个独立操作;
- 如果操作ID对应操作方法,会创建一个内联操作;
- 否则会抛出yii\base\InvalidRouteException异常。
- 控制器按顺序调用应用主体、模块(如果控制器属于模块)、 控制器的
beforeAction()
方法;- 如果任意一个调用返回false,后面未调用的
beforeAction()
会跳过并且操作执行会被取消; action execution will be cancelled. - 默认情况下每个
beforeAction()
方法会触发一个beforeAction
事件,在事件中你可以追加事件处理操作;
- 如果任意一个调用返回false,后面未调用的
- 控制器执行操作:
- 请求数据解析和填入到操作参数;
- 控制器按顺序调用控制器、模块(如果控制器属于模块)、应用主体的
afterAction()
方法;- 默认情况下每个
afterAction()
方法会触发一个afterAction
事件, 在事件中你可以追加事件处理操作;
- 默认情况下每个
- 应用主体获取操作结果并赋值给响应.