不能将公共组件库直接塞入主项目src/,否则会形成“伪单体”耦合:user类被payment类直接new导致无法复用,且"app": "src/"的宽泛psr-4映射引发autoload扫描爆炸;正确做法是为每个组件(如auth)建立独立包与path仓库,通过精准命名空间映射(如"myapputh": "components/auth/src/")实现物理隔离与契约通信。

为什么不能把公共组件库直接塞进主项目src/
因为会立刻触发“伪单体”耦合:一旦 AppModelsUser 被 AppServicesPayment 直接 new 实例,抽离复用就彻底失效。更隐蔽的问题是 autoload 扫描爆炸——如果 PSR-4 映射写成 "App": "src/",自动加载器每次类查找都要遍历整个 src/ 目录树,哪怕里面混着 migrations、config、tests 等非类文件。
怎么用 path 仓库让公共组件真正可复用
每个公共组件(如 auth、logging、notification)必须独立成包,带自己的 composer.json:
{
"name": "myapp/auth-component",
"type": "library",
"autoload": {
"psr-4": {
"MyApp\Auth\": "src/"
}
}
}
主项目 composer.json 中声明本地仓库并 require:
"repositories": [
{
"type": "path",
"url": "./components/auth"
}
],
"require": {
"myapp/auth-component": "*"
}
执行 composer update myapp/auth-component 后,Composer 会在 vendor/myapp/auth-component 创建软链接,既保持物理隔离,又享受自动加载。关键点:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 组件包不能有
require-dev或测试框架依赖,否则污染主项目 - 组件内禁止硬编码引用主项目命名空间(如
AppModels*),契约只能通过接口或 DTO 传递 - 所有组件的
autoload必须收敛到自身命名空间,绝不写"App": "components/auth/src"
autoload 性能卡点在哪?怎么破
不是 dump-autoload -o 不够快,而是 PSR-4 配置太宽泛导致扫描路径过长。真实瓶颈常出现在:
-
"App": "src/"下混着大量非类文件(.php 配置、.blade.php 模板、.json schema) - 多个组件共用同一级目录结构,autoload 映射互相覆盖
- 开发时开了
"optimize-autoloader": true,但生产部署没加--optimize-autoloader参数
有效做法:
- 把核心类路径拆细:
"MyApp\Auth\": "components/auth/src/",而非兜底映射 - 用
classmap显式收录单文件工具类:"classmap": ["components/auth/src/Helpers.php"] - CI 流水线中强制加
composer install --no-dev --optimize-autoloader --no-interaction
锁文件怎么管才不翻车
超大规模单体里,composer.lock 不是“提交就行”,而是要分层管控:
- 主项目根目录的
composer.lock必须提交,且禁止被.gitignore忽略 - 每个公共组件包也必须自带
composer.lock(用于单独测试和发布),但它的 lock 文件不参与主项目安装 - CI 构建前必须校验:
composer validate+composer diagnose,尤其检查 PHP 版本和扩展是否匹配 - 上线前跑一次
composer prohibits monolog/monolog,确认没因某个组件锁死旧版而阻塞安全更新
最易被忽略的是组件间的间接依赖冲突——比如 auth 组件 require symfony/http-client:^5.4,而 notification 组件 require ^6.0,这种冲突不会在本地 composer update 时立即暴露,只会在 CI 安装时爆红。必须定期用 composer show --tree 人工扫一遍依赖树。










