先看composer dump-autoload -v输出是否扫描到目标类,若未出现说明配置或路径有误;再检查autoload_psr4.php和autoload_classmap.php中映射是否正确,最后确认文件路径、命名空间、类名三者严格一致。

确认报错类是否被 composer 扫描到
直接看 composer dump-autoload -v 的输出,它会逐行打印扫描路径、匹配的类名、跳过的文件。如果目标类(比如 AppServicesMyService)压根没出现在输出里,说明 composer 根本没看到它——不是代码写错了,是配置或路径挡在了第一步。
常见卡点:
-
composer.json中"psr-4"条目末尾少了一个反斜杠,例如写成"App": "app/"而不是"App\": "app/",会导致整个映射失效,但命令不报错 - 路径写成了
./app/或绝对路径,PSR-4 只接受项目根目录下的相对路径 - 文件放在
gitignore里,dump-autoload默认跳过被忽略的文件 - 命名空间用了小写前缀(如
myapp\),但目录名是MyApp/,Linux 下大小写敏感直接不匹配
检查 autoload_psr4.php 是否包含你的命名空间
打开 vendor/composer/autoload_psr4.php,搜索你的命名空间前缀(如 'App\')。如果没找到,说明配置没生效;如果找到了但路径不对(比如指向 $baseDir . '/src',而你实际把类放在 app/),就是 composer.json 里路径写错了。
注意:dump-autoload -o 会生成 autoload_classmap.php,但 PSR-4 映射仍存在。如果 classmap 里没有该类,才会 fallback 到 PSR-4 查找——所以得两个文件都看。
临时验证方式:删掉 vendor/composer/autoload_*.php 全部文件,再跑 composer dump-autoload --no-optimize,强制走纯 PSR-4 实时查找,绕过 classmap 缓存干扰。
验证文件路径、命名空间、类名三者是否完全一致
PSR-4 不是“拼字符串”,而是截掉命名空间前缀后,把剩余部分转成小写路径段再拼。例如配置 "App": "app/",那么 AppHttpControllersUserController 必须落在 app/Http/Controllers/UserController.php,不能是 app/app/Http/... 或 app/http/controllers/usercontroller.php。
必须核对的三点:
- 文件物理路径是否与命名空间推导结果**逐级对应**(包括目录名大小写)
- 文件内
namespace声明是否和composer.json中的前缀完全一致(含结尾双反斜杠) - 类名是否与文件名**全字符匹配**(
UserController.php→class UserController,不是usercontroller也不是Usercontroller)
排除入口未加载或优化模式干扰
很多“Class not found”其实和自动加载无关,而是脚本根本没引入 vendor/autoload.php。检查报错堆栈最底端是否出现 require_once 或 include 相关路径——如果没有,先确认入口文件(如 public/index.php)里写了 require __DIR__.'/../vendor/autoload.php';,且路径能正确解析。
开发中新增类后报错,大概率是启用了优化模式("optimize-autoloader": true 或 classmap-authoritative)。此时 classmap 是静态快照,不会随文件增删更新。解决方法:
- 临时加参数:
composer dump-autoload --no-optimize - 长期方案:在
composer.json的config段设"optimize-autoloader": false和"classmap-authoritative": false,再执行composer dump-autoload
classmap-authoritative 模式下,Composer 会彻底跳过 PSR-4 扫描,只查 classmap 表——表里没有,就直接抛错,连路径推导都不做。这点最容易被忽略。











