目录
[TOC]
## 目录结构
### WorkerA
```bash
WorkeA // WorkeA
├── app // 应用部分
│ ├── Controller // 在这里创建你的控制器
│ │ └── Controller.php // 控制器基类
│ ├── Exceptions // 异常处理,这里可以自定义异常
│ │ └── Handler.php // 异常 Handler
│ ├── Middleware // 在这里创建你的中间件
│ │ └── AppMiddleware.php // 默认中间件
│ └── Models // 在这里创建你的模型
│ │ └── Model.php // 模型基类
├── bootstarp // 初始化引导
│ └── boot.php // 初始化
├── config // 配置
│ ├── app.php // 应用配置
│ ├── database.php // 数据库配置
│ └── middleware.php // 中间件配置
├── routes // 在这里创建你的路由
│ └── app.php // 默认路由
├── tmp // 临时文件目录,你可以放一些临时文件如上传的文件等
│ └── log // 这目录会保存日志文件
├── WorkerStart.php // 启动脚本
└── HttpsStart.php // https 启动脚本
```
### WorkerF
```bash
WorkeF // WorkeF
├── DB // 数据库模块
│ ├── Drivers // 数据库驱动
│ │ ├── ConnectorInterface.php // 驱动的接口
│ │ ├── PDODriver.php // PDO 驱动基类
│ │ ├── Mysql.php // Mysql 驱动
│ │ ├── Pgsql.php // PostgreSql 驱动
│ │ └── Sqlite.php // Sqlite 驱动
│ ├── ConnectException.php // 自定义连接异常
│ ├── DB.php // 查询构造器门面
│ ├── Model.php // 模型类
│ └── Redis.php // redis 类
├── Exceptions // 异常处理
│ ├── ExceptionHandler.php // 默认异常 Handler
│ └── ExceptionHandlerInterface.php // 异常 Handler 接口
├── Http // Http 模块
│ ├── Controller.php // 控制器类
│ ├── File.php // 文件类
│ ├── Middleware.php // 中间件类
│ ├── MiddlewareInterface.php // 中间件接口
│ ├── Requests.php // 请求类
│ ├── Response.php // 响应类
│ └── Route.php // 路由类
├── Tool // 工具
│ ├── DotArr.php // 点式路径的存取工具
│ └── Pipeline.php // 管道模式工具
├── WorkerSocket // workerman 对接部分
│ └── WorkerHttp.php // workerman http 封装部分
├── App.php // 启动类
├── Config.php // 配置类
├── Error.php // 错误处理类
└── IOCContainer.php // IOC 容器类
```
## 框架运行流程
WorkerA 是一个轻量的框架,其运行流程并不复杂。
### 框架的启动流程
运行 sudo php WorkerStart.php start 后会做几件事:
1、加载引导
引导文件 bootstrap/boot.php 会被加载。这个文件会加载所有的 config 和 routes 到内存,同时设置时区、默认 ExceptionHandler 等。
2、初始化
首先框架会初始化 workerman 的端口监听、进程数、日志路径等。然后在 onWorkerStart 回调中运行 WorkerF\App::init() 进行框架的初始化,包括了注册单例 (config/app/php 中配置 registers)、初始化数据库连接等。
3、注册 onMessage 回调,每当有 HTTP 请求时,回调会调用 WorkerF\App::run($con) 方法。
### 请求处理流程
每当有 HTTP 请求时,WorkerF\App::run($con) 方法会被执行。
首先判断该请求是否通过全局中间件 (如果设置了的话),通过则交给路由进行路由分发、返回分发结果,否则直接返回中间件处理后的响应。
如果业务逻辑在运行中抛出了异常,框架会判断用户是否设置了 ExceptionHandler 来决定选择哪个 Handler 去处理异常返回结果。
详细代码参见 [WorkerF\App](https://github.com/wazsmwazsm/WorkerF/blob/master/src/WorkerF/App.php)。
### 路由分发
路由的分发通过 WorkerF\Http\Route::dispatch($request) 方法来执行。
首先,路由分发时会判断该请求的 path 是否存在于路由列表中。如果该路由是动态路由,还会检测该路由是否存在于路由缓存。
然后检查该请求是否通过路由中间件 (如果设置了的话)。
如果中间件检查未通过,则返回中间件处理后的结果。
如果检查通过,根据路由的设置执行闭包,或者通过 IOC 容器来执行控制器方法 (进行自动依赖注入等操作)。
详细代码参见 [WorkerF\Http\Route](https://github.com/wazsmwazsm/WorkerF/blob/master/src/WorkerF/Http/Route.php)。