Composer autoload未生效主因是映射未生成或失效:需确认包已安装、autoload.php时间戳最新、PSR-4配置严格匹配路径/命名空间/大小写,必要时加--dev或-o参数重生成,并确保入口文件用__DIR__正确引入。

不是 require 没装上,是 autoload 映射根本没生成或没生效——composer require 默认会触发 dump-autoload,但一旦你之前加过 --no-scripts 或改过 vendor/autoload.php,这步就静默跳过了。
先确认包到底装没装上
别猜,直接查文件系统和 Composer 状态:
- 运行
composer show vendor/package-name(比如composer show laravel/helpers),如果报 “Package not found”,说明压根没进composer.json的require区块,require命令可能执行失败或被跳过 - 检查
vendor/目录下是否存在对应路径:ls -d vendor/vendor-name/package-name,不存在就是下载中断或权限问题 - 看
vendor/autoload.php文件修改时间:stat vendor/autoload.php | grep Modify,如果比composer require时间还早,说明 autoload 没刷新
dump-autoload 不生效?重点看参数和作用域
默认的 composer dump-autoload 只处理主 autoload 配置,对 autoload-dev、classmap 或移动过的类完全无感。
- 新增了测试类(如
tests/Feature/ApiTest.php)?必须加--dev:composer dump-autoload --dev - 重命名或移动过类文件(比如从
app/Http/Controllers搬到app/Controllers)?要强制重建 classmap:composer dump-autoload -o(-o会触发classmap扫描,前提是composer.json里已声明"classmap": ["app/"]) - 部署后仍报错?PHP 的 OPCache 可能缓存了旧的 autoload opcode,得清 OPCache 或重启 PHP-FPM,光刷页面没用
PSR-4 映射三要素:一个都不能错
Composer 不做容错。命名空间、路径、大小写三者只要有一处不严丝合缝,类就“消失”,且不报错。
-
"psr-4": {"App\": "src/"}—— 注意App\后面是双反斜杠(JSON 中表示单个字面量反斜杠),写成"App"或"App/"都会导致前缀匹配失败 - 路径必须是相对于项目根目录的纯字符串:
"src/"✅,"./src/"❌,"/full/path/src/"❌ - 文件名必须与类名完全一致(含大小写):
UserService.php对应class UserService,userservice.php在 Linux 上就是另一个文件 - 打开
vendor/composer/autoload_psr4.php,搜你的命名空间前缀,确认映射路径是$baseDir . '/src'这种格式,再手动ls验证该路径下是否存在对应文件层级
入口脚本里 require vendor/autoload.php 路径写错了
这是最容易被忽略的硬伤——require 'vendor/autoload.php' 看似没问题,但实际依赖当前工作目录(CWD),而 CLI 和 Web SAPI 的 CWD 往往不同。
- 正确写法永远是:
require __DIR__ . '/vendor/autoload.php'; - 错误写法包括:
require '../vendor/autoload.php'、require 'vendor/autoload.php'、甚至require dirname(__DIR__) . '/vendor/autoload.php'(路径链太长易断裂) - 验证方式:在入口脚本开头加一行
var_dump(file_exists(__DIR__ . '/vendor/autoload.php'));,输出bool(true)才算真正引入成功
最麻烦的其实是“看起来都对”的情况:命名空间末尾反斜杠漏了、路径大小写在开发机上不报错、OPCache 没清干净、或者 autoload-dev 的类被当成生产代码调用——这些点不逐个卡死,问题就会反复出现。











