PHP 项目架构决策记录

wen PHP项目 2

本文目录导读:

PHP 项目架构决策记录

  1. 架构决策记录:PHP 项目技术栈与分层策略
  2. 针对特定场景的快速决策速查表

编写一份高质量的 PHP 项目架构决策记录(ADR) 需要结合具体业务场景,由于你没有提供具体的项目背景(如:是单体应用、微服务、电商、SaaS 还是框架选型问题),我将提供一个通用且高度可定制的模板,并附上针对 PHP 生态特定痛点的决策示例。

你可以直接复制以下 Markdown 格式,替换方括号 中的内容即可。


架构决策记录:PHP 项目技术栈与分层策略

状态:[提议中 / 已接受 / 已废弃] 日期:[202X-XX-XX] 决策者:[技术负责人、核心开发成员]


背景(Context)

当前项目 [项目名称] 面临以下核心诉求与痛点:

  • 业务需求:需要支持 [高并发/复杂业务逻辑/快速迭代/多租户/严格合规]。
  • 团队现状:团队主要熟悉 [原生 PHP / Laravel / Symfony / ThinkPHP],人数为 [X] 人,DevOps 能力 [强/中/弱]。
  • 遗留系统:存在 [老旧的 PHP 5.x 系统 / 单体巨石应用 / 无自动化测试] 需要兼容或重构。
  • 部署环境:目标部署于 [自建机房 / 阿里云 / AWS / Docker/K8s],PHP 版本要求为 [7.4 / 8.1 / 8.3]。

核心决策问题:我们需要决定采用何种语言版本、框架、架构风格(分层/DDD/微服务)及关键组件来平衡交付速度与长期可维护性。


决策(Decision)

我们决定采用“基于现代 PHP 8.x 的模块化单体(Modular Monolith)为主,预留服务拆分能力”的架构策略。

具体决策内容如下:

  • 语言版本:强制使用 PHP 8.2+,充分利用 readonly 类、枚举类型、构造器属性提升等特性。
  • 主框架:选择 Laravel 11.x(或 Symfony 7.x / ThinkPHP 8.0,取决于团队熟悉度),原因:生态丰富、ORM 强大、队列与事件系统完善。
  • 架构风格分层架构 + DDD(领域驱动设计)战术模式
    • Interface/Http 层:Controller 只负责参数校验和响应返回,不写业务逻辑(瘦控制器)。
    • Application 层:Service 负责业务流程编排、事务管理。
    • Domain 层:Entity 与 Domain Service 承载核心业务规则,不依赖 Laravel 框架(保持纯 PHP)。
    • Infrastructure 层:Repository 实现、第三方 SDK 封装、Eloquent ORM 模型(仅存在于该层)。
  • 数据库:MySQL 8.0+(InnoDB),核心表强制使用 UUID 或雪花ID(避免自增ID暴露业务量),所有表包含 created_atupdated_at
  • 关键中间件
    • 缓存:Redis(用于缓存、Session、队列驱动)。
    • 队列:Redis 驱动,用于异步任务(邮件、短信、耗时计算)。
    • API 认证:Laravel Sanctum(个人令牌)或 JWT(OAuth2.0)取决于是否有第三方接入需求。
  • 前端分离:前后端完全分离,后端仅返回 JSON 数据,前端使用 Vue3/React 独立部署(通过 Nginx 反向代理)。

决策背景与驱动因素(Motivation)

  1. 模块化单体 相比微服务,在项目初期能极大降低运维复杂度和调试成本,同时通过物理目录隔离app/Modules/*)保留了未来拆分为独立服务的可能性。
  2. PHP 8.2 相比 7.4 在性能上提升约 20-30%,且强类型特性有助于减少运行时错误,提高代码静态分析能力(PHPStan Level Max)。
  3. 瘦控制器 + Service 层 解决了历史项目中“Controller 里堆 SQL”导致无法单元测试的痛点。
  4. 领域层纯 PHP 确保了核心业务逻辑不依赖于 Laravel Facade,方便未来在不同框架间迁移或进行单元测试。

备选方案(Alternatives Considered)

方案 优点 缺点/被否决原因
原生 PHP(无框架) 性能极致、无依赖 开发效率极低,安全性(SQL注入、XSS)难以系统化防御,不符合团队协作要求。
Laravel 单体式(MVC 无目录分层) 上手快,代码量少 随着业务增长,Model 文件会膨胀至“上帝类”,Service 间相互调用耦合严重,后期维护成本高。
Hyperf / Swoole 常驻内存 超高并发 对团队技术要求高,Debug 调试方式与传统 PHP 不同,且目前项目预估并发未达到该量级。
Presto / ClickHouse 分析型查询快 事务支持弱,不适合作为核心 OLTP(联机事务处理)业务的唯一存储。

关键改动与影响(Consequences)

正面影响:

  • 代码结构强制统一,新成员通过目录结构即可定位功能代码。
  • 单元测试覆盖率可以提升至核心业务 80% 以上。
  • 接口响应速度预计提升 [X]%(得益于 PHP 8 和 Redis 缓存)。

负面影响 / 风险:

  • 过度设计风险:DDD 分层可能导致初期开发速度略慢。
  • 学习成本:团队需要熟悉 Repository 模式,避免在 Controller 中直接使用 Model::query()
  • 部署不可变:由于使用了 readonly 属性和强类型,PHP 7.x 环境无法兼容,必须为 PHP 8.2 专门配置运行环境

具体实施指导 (Code Guidelines)

在实际写代码时,必须遵守以下规则以落实架构决策:

  • 禁止在 Blade 模板中书写复杂业务逻辑。
  • 禁止在控制器中使用 DB::table() 查询,必须通过 Repository 接口调用。
  • 遵循 Fat Domain,所有与金额、状态流转相关的逻辑封装在 Domain 层,不可直接在 Service 中写 if 判断状态。
  • Eloquent Model 必须继承自 App\Models\BaseModel,且只定义 关联关系、字段映射(casts)、作用域(Scope)。

后续待办事项(Action Items)

  • [ ] 搭建基础的 PHPStan/Psalm 静态分析环境,并设置为 Git commit 钩子。
  • [ ] 编写本项目独有的 Architecture Test(如使用 PestPHP 或 PHPMD 校验:禁止 Impl 类在 Http 层直接引用)。
  • [ ] 制定数据库迁移规范(使用 Laravel Migrations,禁止手工改库)。

针对特定场景的快速决策速查表

如果你只是想快速选型,可参考以下简短建议:

  1. 如果是个人的博客/小型CMS:直接选 Laravel 11 + Laravel Breeze + SQLite,不需要做 DDD。
  2. 如果是企业级中后台系统(如 ERP、OA)Laravel + AdminLTE/Voyager + RBAC扩展,架构使用多层 Service 即可。
  3. 如果是电商或金融类系统(高一致性要求)Laravel/Symfony + MySQL + Redis,必须引入 队列 (Horizon)事务脚本,领域层设计需仔细推敲。
  4. 如果是支付接口/API 服务(纯后端)Laravel + Sanctum + Spatie/laravel-permission + API Resources,使用 strict_types 和 DTO(数据传输对象)。

注意中关于 Laravel 的版本号(如 11.x)、PHP 版本(8.2)是基于 2024-2025 年的行业主流选择,请在决策时根据实际 Packagist 最新版本做稍许调整。

如果你有具体的业务场景(如电商库存超卖、IM即时通信),欢迎提供更多细节,我可以为你生成更贴合业务的 ADR。

抱歉,评论功能暂时关闭!