# 控制器架构
* * * * *
先来看看咱们系统的架构图,便于理解结构。
![](https://box.kancloud.cn/3a078a1fca6e731d603895a0e9c5dd8e_1366x1334.png)
从图上可以看到系统初始化行为执行完毕就进入了公共控制器,为什么会执行进公共控制器呢?
咱们随便弄个URL来分析一下。
![](https://box.kancloud.cn/a185fc2e38f3843d413fa81e04512bee_1917x759.jpg)
这个是统计分析下的执行速度功能,URL是https://demo.onebase.org/admin.php/statistic/exespeed.html
admin.php 入口进来的肯定就是 admin模块咯,statistic控制器,exespeed方法。
找到方法所在位置
![](https://box.kancloud.cn/8d31aef817b99a8e867bcecf4dedc8f2_1107x905.jpg)
代码拉到最上方可以看到 class Statistic extends AdminBase,
说明此类继承了 AdminBase,通过命名就可以猜测到这个就是admin模块的基础控制器,既然继承了AdminBase 那肯定是会先执行父类的构造方法,然后打开AdminBase.php发现class AdminBase extends ControllerBase ,而 ControllerBase 是公共模块下的控制器根源,为什么说是根源呢?因为这是OneBase中最底层的控制器了,再往下看就是 class ControllerBase extends Controller,框架的控制器就不在讲解范围了,所以咱们将ControllerBase当做最底层的控制器。
通过分析咱们大概就心里有个控制器继承层次关系了,Statistic 继承了 AdminBase 继承了 ControllerBase。
因为类实例化之前会执行父类构造函数,那么执行的流程就是 ControllerBase -> AdminBase -> Statistic
此处只是随便拿一个统计分析类的某个操作来讲解,其他控制器类也是一样的流程,当然也有例外 比如 Login 控制器,因为在AdminBase 中有登录验证,若继承AdminBase那岂不是验证不通过,那就没办法登录咯。
但是 Login 中咱们还需要获取请求信息,而请求信息是在ControllerBase中进行的初始化,所以此处就直接跳过了AdminBase,继承 ControllerBase,这样就不用验证登录并且使用请求信息了。
其他模块下的控制器也是一样,可以看到api模块下的控制器中有 ApiBase.php,index模块下的控制器中有IndexBase.php等。
控制架构设计中,这种多层父类控制器是有好处的,比如咱们想整套系统执行时都执行某操作,那么所有模块下的控制器都会执行 ControllerBase, 那就可以放在 ControllerBase中,若咱们想在api模块下做一个请求频率限制而不影响其他模块,那么咱们就可以把代码放在 ApiBase.php中触发。
- 序言
- 基础
- 安装环境
- 安装演示
- 规范
- 目录
- 介绍
- 后台介绍
- 后台首页
- 会员管理
- 系统管理
- 系统设置与配置管理
- 菜单管理
- 系统回收站
- 服务管理
- 插件管理
- 文章管理
- 接口管理
- 优化维护
- SEO管理
- 数据库
- 文件清理
- 行为日志
- 执行记录
- 统计分析
- 接口介绍
- 接口文档
- 错误码设计
- Token介绍
- 前台介绍
- 架构
- 架构总览
- 生命周期
- 入口文件
- 模块设计
- 依赖注入
- 控制器架构
- 逻辑架构
- 验证架构
- 服务架构
- 模型架构
- 行为架构
- 插件架构
- 配置
- 配置介绍
- 配置加载
- 配置扩展
- 请求
- 请求信息
- 日志
- 后台行为日志
- 系统执行日志
- 框架日志
- 数据
- 数据库设计
- 数据字典
- 数据库操作
- 事务控制
- 混合操作
- 实战
- 控制器
- 逻辑与验证
- 视图与模型
- 插件研发
- 服务研发
- 接口研发
- 杂项
- 数据导入导出
- 二维码条形码
- 邮件发送
- 云存储服务
- 支付服务
- 短信服务
- 微信分享
- 生成海报
- 聊天室
- PJAX
- Demo
- Widget
- 附录
- 常量参考
- 配置参考
- 函数参考
- 进阶
- Redis
- 自动缓存
- 全自动缓存
- 索引
- 数据签名
- 全自动事务
- 队列