ARCHITECTURE

7 层中间件,6 个 Provider,
构成 tphelp 的骨架。

中间件串起安全与审计、Provider 隔离插件边界、CrudController 一行 trait 得全套 CRUD、AutoRouter 自动注册——加控制器零配置。

01 / MIDDLEWARE CHAIN

请求经过 7 层中间件才到控制器。

每一层只做一件事,链式串联,按需开启。

StaticFile静态文件直返
→
SecurityGuard安全头/CORS
→
GatewayKey网关密钥校验
→
AdminAuthToken 鉴权
→
RateLimit频率限制
→
Idempotent幂等保护
→
OperationLog操作审计
层序中间件职责关键行为
1StaticFile静态资源直接返回匹配 .js/.css/.png 等后缀,命中则直返不进入后续逻辑
2SecurityGuard安全头部设置X-Frame-Options、X-Content-Type-Options、CORS 头注入
3GatewayKey网关层密钥校验校验请求头携带的 gateway_key,拒绝非授权来源
4AdminAuth身份鉴权Token 解析、sha256 指纹比对 login_log.token_hash、注入 appUser/isSuper、8h TTL
5RateLimit频率限制基于 request_key 或 IP 做窗口限流,防止暴力调用
6Idempotent幂等保护基于 idempotent_key 去重,防止重复提交
7OperationLog操作审计记录每个请求的 action/参数/结果/耗时,写入 append-only 日志
02 / PROVIDER LAYER

6 个 Provider,插件唯一入口。

所有插件只能通过 Provider 层与基座交互,签名锁定,不污染基座代码。

AccountProvider

账号查询、创建、状态管理——插件获取当前登录用户信息、校验权限的唯一入口。

DictProvider

字典数据读取——插件获取系统字典项(如状态枚举、类型映射),统一 dict_group/dict_item 体系。

ConfigProvider

系统配置存取——插件读写 system_config 表,支持分组、缓存、类型安全取值。

Context

请求上下文注入——当前 account_id、role_id、plugin_key 等上下文信息,由中间件写入、Provider 提供读取。

AuditProvider

审计日志写入——插件调用统一审计接口,自动记录操作人、时间、参数、结果,写入 operation_log。

MenuProvider

菜单注入与卸载——插件安装时按 plugin_key 写入菜单、卸载时按 key 清理,实现菜单动态挂载。

03 / CRUDCONTROLLER V3

一行 trait,全套 CRUD。

use CrudController trait,控制器立即获得 9 个方法 + 审计打码 + 回收站。

01

list

分页列表,支持搜索、排序、字段筛选

02

all

全量列表(不分页),适合下拉选项

03

store

新增记录,自动校验 request DTO

04

update

更新记录,按 ID 匹配,自动记录操作审计

05

delete

软删,置 deleted_at + status=4(软删联动),写入 delete_log

06

get

单条详情,支持关联预加载

回收站三件套

// trashList 回收站列表
// restore  还原(status 置 1)
// purge    物理删除
✓ 完整软删生命周期

审计打码

// $masked 字段定义
// maskIfNeeded() 自动脱敏
// canViewRaw() 权限判断
✓ Sensitive 单一真源
04 / DTO & ROUTER

输入输出合同,路由零配置。

DTO 层锁定 API 契约、AutoRouter 自动注册 CrudController。

I

request/ DTO

输入合同——定义每个接口的字段、类型、校验规则,控制器通过 DTO 获取已验证的输入数据。

app/http/request/ AccountStoreRequest.php AccountUpdateRequest.php ...
O

resource/ DTO

输出合同——定义每个接口的响应结构,包括字段映射、脱敏规则、关联展开,确保 API 契约一致。

app/http/resource/ AccountResource.php AccountListResource.php ...
AUTOROUTER 扫描 CrudController trait #[Get] / #[Post] 注解 加控制器 = 路由就位

理解架构之后,动手试试。

一行 use CrudController trait 立得全套 CRUD,加控制器零路由配置。