对于一个HTTP应用来说,从用户发起请求到响应输出结束,大致的标准请求流程如下:
-
载入
Composer
的自动加载autoload
文件 -
实例化系统应用基础类
thinkApp
-
获取应用目录等相关路径信息
-
加载全局的服务提供
provider.php
文件 -
设置容器实例及应用对象实例,确保当前容器对象唯一
-
从容器中获取
HTTP
应用类thinkHttp
-
执行
HTTP
应用类的run
方法启动一个HTTP
应用 -
获取当前请求对象实例(默认为
appRequest
继承thinkRequest
)保存到容器 -
执行
thinkApp
类的初始化方法initialize
-
加载环境变量文件
.env
和全局初始化文件 -
加载全局公共文件、系统助手函数、全局配置文件、全局事件定义和全局服务定义
-
判断应用模式(调试或者部署模式)
-
监听
AppInit
事件 -
注册异常处理
-
服务注册
-
启动注册的服务
-
加载全局中间件定义
-
监听
HttpRun
事件 -
执行全局中间件
-
执行路由调度(
Route
类dispatch
方法) -
如果开启路由则检查路由缓存
-
加载路由定义
-
监听
RouteLoaded
事件 -
如果开启注解路由则检测注解路由
-
路由检测(中间流程很复杂 略)
-
路由调度对象
think
初始化
outeDispatch -
设置当前请求的控制器和操作名
-
注册路由中间件
-
绑定数据模型
-
设置路由额外参数
-
执行数据自动验证
-
执行路由调度子类的
exec
方法返回响应thinkResponse
对象 -
获取当前请求的控制器对象实例
-
利用反射机制注册控制器中间件
-
执行控制器方法以及前后置中间件
-
执行当前响应对象的
send
方法输出 -
执行HTTP应用对象的
end
方法善后 -
监听
HttpEnd
事件 -
执行中间件的
end
回调 -
写入当前请求的日志信息
至此,当前请求流程结束。