Composer autoload失败主因是路径映射未覆盖或未重新生成映射表,需检查composer.json中autoload配置、PSR-4命名空间与路径一致性、执行dump-autoload命令、确保vendor/autoload.php正确引入及文件权限/大小写匹配。

composer dump-autoload 执行后类还是找不到
这通常不是 autoload 本身坏了,而是 composer.json 里声明的自动加载规则没覆盖到你的文件路径,或者你改了代码但没重新生成映射。Composer 不会监听文件变化,它只认 vendor/autoload.php 里那一份静态映射表。
- 检查
autoload或autoload-dev字段是否包含你新增类所在的目录,比如"src/": ["src/"]—— 注意末尾斜杠不是必须的,但路径必须和实际require时的命名空间前缀对得上 - 确认类文件名和类名严格符合 PSR-4 规范:命名空间
App\Http\Controllers对应路径src/Http/Controllers/YourController.php - 如果刚加了新类但没跑命令,
composer dump-autoload是必须的;加了-o(优化)参数会生成 classmap,适合生产环境,但开发中用默认模式更利于调试
修改了 composer.json 后忘记执行 dump-autoload
很多人改完 autoload 配置就直接跑代码,结果报 Class not found。Composer 读取配置是一次性的,composer install 或 composer update 会顺带触发 dump,但纯配置变更不会自动生效。
- 只要动了
autoload、autoload-dev、psr-4、classmap这些字段,就必须手动运行composer dump-autoload - 加
--no-scripts会跳过 post-autoload-dump 脚本,如果你依赖某些自定义注册逻辑,别加这个参数 - CI 环境里常见漏掉这步,导致测试通过但线上报错,建议把
dump-autoload写进部署脚本
vendor/autoload.php 被误删或未引入
有些项目为了“轻量”手动删了 vendor/autoload.php,或者入口文件里忘了 require 它,这时候不管映射多准都没用。
-
vendor/autoload.php是 Composer 自动生成的引导文件,不能手写替代,也不能靠 IDE 自动补全“蒙混过关” - 入口脚本(如
index.php或测试启动文件)第一行应该是require __DIR__.'/vendor/autoload.php';,路径错一个点都不行 - 如果用了 Docker 或部署工具,确认
vendor/目录完整复制过去,特别是autoload.php和composer/autoload_*.php这些小文件容易被 .gitignore 或 rsync 忽略
PSR-4 映射和文件权限/大小写冲突
Linux 下大小写敏感,Windows/macOS 默认不敏感,这就埋了坑:本地能跑,上线就报错。另外,某些 NFS 或容器挂载场景下,文件权限可能让 Composer 无法读取类文件,导致 dump 时跳过它们。
- 检查类名
MyController是否对应文件名MyController.php,而不是mycontroller.php或Mycontroller.php - 运行
composer dump-autoload -v(verbose 模式),看输出里有没有 “Skipping” 或 “Could not open input file” 提示,定位具体哪个文件被跳过了 - 在 Linux 服务器上,用
ls -l src/Your/Namespace/确认文件可读,尤其注意 Docker 中挂载卷的 uid/gid 是否匹配










