composer install 不生成 PSR-4 自动加载,真正起作用的是 composer dump-autoload;PSR-4 映射必须在 composer.json 的 autoload 段明确定义命名空间前缀与目录的对应关系,且命名空间末尾需双反斜杠、路径不以斜杠结尾,修改后须手动执行 dump-autoload 才生效。

composer install 本身不生成 PSR-4 自动加载,真正起作用的是 composer dump-autoload
很多人以为 composer install 会“生成”自动加载逻辑,其实它只是根据 composer.lock 下载包、然后调用一次 composer dump-autoload(如果 autoload 配置有变化或 lock 文件缺失)。真正决定类如何被加载的,是 composer.json 中的 autoload 配置 + dump-autoload 生成的 vendor/autoload.php 和 vendor/composer/autoload_psr4.php。
PSR-4 映射必须在 composer.json 的 autoload 段里明确定义
只写 "autoload": {"psr-4": {}} 是无效的。必须给出命名空间前缀和对应目录的映射关系,且目录路径需相对于 composer.json 所在位置:
-
"App\": "src/"表示所有以App开头的类,从src/目录下按子命名空间找文件(如AppHttpControllerHome→src/Http/Controller/Home.php) - 命名空间末尾必须带双反斜杠
\,漏掉会导致匹配失败("App": "src/"不生效) - 目录路径不能以
/结尾("src/"✅,"src//"❌),否则生成的autoload_psr4.php里键名会多出斜杠,运行时报Class not found - 多个映射可并存,但不能有前缀重叠(
"App\": "src/"和"App\Test\": "tests/"会冲突)
执行 composer dump-autoload 才真正刷新映射
修改 composer.json 的 autoload 后,必须手动运行该命令,否则旧的 autoload_psr4.php 仍生效:
- 开发中加了新命名空间?改完
composer.json后跑一次composer dump-autoload - 想验证是否生效?检查
vendor/composer/autoload_psr4.php里有没有你写的键值对 - 加
-o参数(composer dump-autoload -o)会生成优化后的 classmap,但会绕过 PSR-4 动态查找逻辑——仅适合无动态目录结构的场景,日常开发不建议加 - CI/CD 中若发现类找不到,优先确认该步骤是否被执行,而非直接重跑
install
常见报错:类存在但 Class not found,90% 是路径或命名空间不匹配
PSR-4 不是“猜路径”,它严格按规则拼接。比如:
- 文件
src/Models/User.php里写了namespace AppModels;,但composer.json写的是"App\": "app/"→ 找不到,因为实际路径是src/,不是app/ - 文件放在
src/Http/Controllers/HomeController.php,但类声明为namespace AppHttp; class HomeController→ 找不到,因为 PSR-4 要求类名与文件名一致(HomeController对应HomeController.php),且命名空间必须完整包含子目录(这里是AppHttpControllers) - 使用了大小写混用的目录名(如
Src/),但在配置里写"src/"→ 在 Linux 环境下必然失败,Windows 可能侥幸通过
最稳妥的验证方式:删掉 vendor/composer/autoload_*.php,再跑 composer dump-autoload,然后打开生成的 autoload_psr4.php,逐行对照你的命名空间和路径。


















