一图详细解析ThinkPHP5.0框架
文章目录
因为公司技术栈上用到了TP5.0框架,抽空看了下框架底层的架构设计,画了个思维导图用于技术指导,在此分享。
图片版
文字版
入口文件
定义APP_PATH
加载引导文件 thinkphp/start.php
引导文件
加载基础文件 thinkphp/base.php
-
加载系统常量定义
-
加载环境变量定义文件.env
-
注册自动加载机制
- Composer 自动加载支持
- 注册命名空间 think、behavior、traits
- 自动加载 extend 目录
-
注册错误和异常处理机制
-
设置报错等级 E_ALL
-
设置错误处理程序 Error::appError
-
设置异常处理程序 Error::appException
-
php脚本的析构函数 Error::appShutdown
-
日志写入 Log::save()
- 监听行为 log_write_done
-
-
-
加载惯例配置文件 thinkphp\convention.php
执行应用 App::run()
执行应用
初始化
App::initCommon()
-
注册应用命名空间 app
-
初始化应用App::init()
- 加载应用配置 config.php 加载数据库配置 database.php 加载extra目录下的所有扩展配置文件 加载应用状态配置 “app_status”.php 加载行为扩展 tags.php 加载公共文件 common.php
- 返回配置数组
-
调试模式 config.app_debug
-
注册的根命名空间 config.root_namespace
-
加载额外文件 config.extra_file_list
- 助手函数库,thinkphp/helper.php
-
设置系统时区 config.default_timezone
-
监听行为 app_init
-
返回配置数组
访问绑定
- 模块/控制器绑定 defined(‘BIND_MODULE’)
- 入口自动绑定 config.auto_bind_module
设置全局过滤方法 config.default_filter
多语言
- 设置默认语言 config.default_lang
- 开启多语言 config.lang_switch_on
- 加载系统语言包 thinkphp/lang/zh-cn.php application/lang/zh-cn.php
应用调度信息
-
监听行为 app_dispatch 可直接设置调度
-
路由检测
- 路由到模块/控制器
- 路由到控制器的方法
- 路由到类的方法
- 路由到重定向地址
- 路由到闭包函数
-
调试模式下记录 Log::record()
- ROUTE调度信息
- HEADER请求头
- PARAM请求参数
监听行为 app_begin 可修改调度
请求缓存检查
- 是否开启请求缓存 config.request_cache
- 请求缓存有效期 config.request_cache_expire
- 全局请求缓存排除规则config.request_cache_except
执行调用分发 App:exec() 并返回执行结果数据
-
module 模块/控制器/操作
-
多模块部署 config.app_multi_module
- 绑定模块
- 初始化模块 App::init()
- 模块请求缓存检查
-
设置默认过滤机制
-
自动转换控制器和操作名为小写 config.url_convert
-
获取控制器名,默认为 config.default_controller
-
获取方法名,默认为 config.default_action 是否转换为驼峰命名 config.action_convert
-
监听行为 module_init 参数为 Request 对象
-
实例化控制器类
- 控制器层名称,默认为 config.url_controller_layer
- 控制器类后缀,config.controller_suffix
- 空控制器名称,默认为 config.empty_controller
-
控制器类中的方法是否存在
-
监听行为 action_begin 可修改 controller 对象、执行方法
-
执行类的方法(使用PHP内置反射类)
-
参数绑定
- 请求参数绑定
- 支持依赖注入
-
运行控制方法…
-
if:View()->fetch() 监听行为 view_filter 可修改视图文本
-
-
-
controller 执行控制器操作
-
method 回调方法
-
redirect 重定向跳转
-
function 闭包 App::invokeFunction()
-
response Response 实例
清空类的实例化 Loader::clearInstance()
输出数据到客户端
-
封装为 Response 对象
-
未指定数据类型时,自动识别响应输出类型
- ajax请求 config.default_ajax_return
- 默认请求 config.default_return_type
-
监听行为 app_end 可修改 Response 对象
发送到客户端 Response()->send()
- 监听行为 response_send 参数为 Response 对象
- Trace调试注入 config.app_trace
- 发送状态码HTTP CODE、发送头部信息 HTTP HEADER
- 打印数据 echo
- 提高页面响应 fastcgi_finish_request() 立即冲刷数据到客户端
- 监听行为 response_end 参数为 Response 对象
XMind - Trial Version