类找不到的主因是 Composer 未更新 autoload 文件:需确认包已安装、autoload.php 时间戳最新、PSR-4 路径与命名空间严格匹配,必要时用 dump-autoload --dev -o 或清 OPCache。

为什么 composer require 后类还是找不到?
不是包没装上,而是 Composer 没把新包的自动加载规则写进 vendor/autoload.php。默认情况下,composer require 会自动触发 dump-autoload,但一旦你之前用过 --no-scripts、--no-autoloader,或手动改过 vendor/autoload.php,这步就静默跳过了。
- 运行
composer show 包名确认已安装(比如composer show get-stream/stream-chat) - 检查
vendor/autoload.php文件修改时间,如果比composer require还早,说明没刷新成功 - 别信“我刚装了”,要信文件时间戳和映射内容
composer dump-autoload 不生效的典型场景
执行了命令但报错依旧,大概率是参数没选对,或者环境没清理干净。默认的 composer dump-autoload 只更新静态映射,不碰 classmap,也不处理 autoload-dev 里的路径——而这恰恰是 Laravel Service Provider、测试工具类、Factory 类常出问题的地方。
- 新增了
autoload-dev下的类(比如tests/Feature/ApiTest.php),必须加--dev:composer dump-autoload --dev - 移动或重命名过类文件(如把
app/Http/Controllers/UserController.php改成app/Controllers/UserController.php),要用-o强制重建 classmap:composer dump-autoload -o - 部署后仍报错?可能是 OPCache 缓存了旧的 opcode,PHP 根本没读新生成的 autoload 文件,得清 OPCache 或重启 PHP-FPM
PSR-4 映射不生效:配置、路径、大小写三者缺一不可
哪怕只差一个反斜杠或一个大写字母,类就会“消失”。Composer 不做容错,它严格按 composer.json 里写的前缀和路径拼接文件系统路径,然后找文件。
-
"App\": "src/"表示:类AppServicesUserService必须在src/Services/UserService.php,不能是src/services/userservice.php - Linux 下
UserService.php和userservice.php是两个文件,Windows 可能“凑合过”,一上生产立刻崩 - 检查
vendor/composer/autoload_psr4.php,搜索你的命名空间前缀,确认对应路径是否正确(例如:'App\' => array($baseDir . '/src')) - 别把类直接丢在
src/根目录下——PSR-4 要求子目录结构必须和命名空间层级一致
什么时候该用 -a、-o、--classmap-authoritative?
-a(--classmap-authoritative 的前身)会把所有 PSR-4 类扫描进 classmap,适合调试时快速验证类是否存在;-o 是生产推荐,跳过动态查找,性能高但开发中改了类就得重跑;--classmap-authoritative 更激进:完全禁用 PSR-4 回退机制,只信 classmap,一旦漏扫就真找不到。
- 开发中快速验证:用
composer dump-autoload -a,它会强制扫描整个src/目录,不管 PSR-4 配置是否覆盖到 - 上线前或 CI 流程中:用
composer dump-autoload -o --no-dev,避免 dev 类混入生产 autoload - 不要在本地开发长期依赖
-o——改个文件名不重跑,就等于自己给自己埋雷
最常被忽略的一点:vendor/autoload.php 必须在项目入口第一行 require,且不能被条件逻辑包裹;漏引、引错位置、或被 if (APP_DEBUG) 拦住,整个自动加载就失效了——这时候再怎么 dump-autoload 都没用。











