先按功能边界拆分模块,如认证、支付等,每个包单一职责;再创建标准Composer项目,通过路径仓库引入主项目逐步迁移。

将一个大型项目拆分成多个 Composer 包,核心是解耦功能、明确职责、提升复用性。重点不是技术操作,而是设计思路。以下是具体做法。
按功能边界划分模块
观察项目中哪些部分可以独立存在。比如用户认证、支付处理、日志服务、文件上传等,这些通常具备清晰的输入输出和独立逻辑。
每个包应有单一职责,对外暴露接口或服务类,内部实现可自由调整。
创建独立的包结构
每个子包是一个标准的 Composer 项目,包含自己的 composer.json 和命名空间。
/packages/auth/
src/
AuthManager.php
UserProvider.php
composer.json
{
"name": "acme/auth",
"type": "library",
"autoload": {
"psr-4": {
"Acme\\Auth\\": "src/"
}
},
"require": {
"php": "^8.1"
}
}
注意命名空间与目录结构匹配,便于自动加载。
在主项目中引入本地包
使用 Composer 的路径仓库(path repository)管理本地依赖,开发阶段无需推送到 Packagist。
在主项目的 composer.json 中添加:
"repositories": [
{
"type": "path",
"url": "./packages/auth"
},
{
"type": "path",
"url": "./packages/pdf-generator"
}
]
然后正常 require:
"require": {
"acme/auth": "*",
"acme/pdf-generator": "*"
}
执行 composer update 即可安装并自动加载。
逐步迁移与版本控制
不要一次性拆完。先选一个边界清晰的模块试点。
- 复制代码到新包目录
- 调整命名空间和依赖
- 通过路径仓库接入主项目
- 测试功能是否正常
- 确认无误后提交独立 Git 仓库(可选)
后期可发布到私有 Satis 或 Packagist,实现跨项目复用。
基本上就这些。关键是让每个包能独立存在,主项目只负责组合它们。这样维护、测试、复用都更轻松。










