本地包的PSR-4必须写在包自身的composer.json中,项目根目录只负责通过repositories和require声明路径与依赖,不参与autoload配置;修改后须在项目根执行composer dump-autoload生效。

本地包的PSR-4必须写在包自己的composer.json里
本地包(比如通过repositories配置为path类型引入)不会继承项目根目录的autoload设置,它的自动加载规则完全由它自身composer.json中的autoload字段决定。常见错误是只在项目里加了"repositories",却忘了给本地包自己配psr-4映射。
例如你有一个本地工具包mycompany/utils,放在./packages/utils,那它的packages/utils/composer.json中必须包含:
{
"name": "mycompany/utils",
"autoload": {
"psr-4": {
"MyCompany\Utils\": "src/"
}
}
}
注意:MyCompany\Utils\末尾两个反斜杠是必须的;路径"src/"是相对于该包自身composer.json的位置,不是项目根目录。
项目根目录只需声明仓库,不负责 autoload 配置
项目根目录的composer.json只需告诉 Composer:“这个包我从哪找”,而不是“这个包怎么加载”。它只需要正确配置repositories和require,其他全交给包自己。
-
repositories中用path指向包目录,且路径必须是绝对或相对于项目根的相对路径(如"../packages/utils") -
require中写明包名和版本(如"mycompany/utils": "dev-main"),版本必须与包内composer.json的version或分支名匹配 - 不要在项目根
composer.json的autoload里重复声明本地包的命名空间——这无效,还可能引发冲突
执行 dump-autoload 的位置很关键
修改完本地包自身的composer.json后,必须在项目根目录运行composer dump-autoload,而不是在包目录里。因为 Composer 只在项目根生成vendor/autoload.php和vendor/composer/autoload_psr4.php,这些文件汇总所有已安装包(含本地包)的 PSR-4 映射。
如果执行后仍报Class not found,检查以下几点:
- 本地包的
src/下类文件是否严格遵循命名空间层级:如MyCompany\Utils\Helper→src/Helper.php,不是src/Utils/Helper.php - 文件名大小写是否一致(Linux 下尤其敏感):不能是
helper.php或HELPER.PHP - 是否误把命名空间写成
MyCompany/Utils/(正斜杠)——PSR-4 要求反斜杠 - 运行
composer show mycompany/utils确认包已被识别并安装到vendor/mycompany/utils
验证本地包 PSR-4 是否生效
最直接的方式是在项目中运行一行测试代码:
php -r "var_dump(class_exists('MyCompany\Utils\Helper'));"
返回bool(true)说明映射成功;若为false,优先检查包内composer.json的autoload.psr-4键值是否拼写正确、路径是否存在、类文件是否可读。别跳过composer dump-autoload这步——它不自动触发,改了配置不执行就等于没改。
容易被忽略的一点:本地包一旦通过path方式引入,Composer 就会把它当作“已安装包”处理,其autoload字段会被合并进全局映射表;但这个过程完全静默,没有提示,出问题时只能靠class_exists()或composer show --platform手动确认。











