必须运行 composer dump-autoload -o 才生效,否则修改的 psr-4 配置无效;命名空间前缀需写为 "App\",路径须为相对目录如 "src/",且类文件路径、命名空间、文件名须严格一致。

改完 composer.json 里的 psr-4 配置,不运行 composer dump-autoload 就等于没配——Composer 不监听文件变化,只读 vendor/composer/autoload_psr4.php 这个静态映射表。
命名空间前缀必须以双反斜杠结尾
写成 "App" 或 "App" 都会失败。JSON 解析时单反斜杠会被转义丢失,"App" 实际变成 "App",被 Composer 当作 PSR-0 处理或直接忽略;"App" 则被当成完整命名空间,后续类名无法拼接路径。
-
"App\"✅ 正确:JSON 解析后为"App\",匹配所有App\*类 -
"App"❌ 错误:解析后是"App",不满足 PSR-4 前缀要求 -
"App\Controller\"和"App\"不能共存:后者会覆盖前者,App\Controller\Foo永远走不到Controller路径
路径必须是相对路径且推荐结尾带斜杠
路径值是相对于 composer.json 所在目录的子路径,不能以 / 开头(如 "/src/" 是绝对路径,直接报 Invalid path),也不能缺末尾斜杠导致拼接错误(如 "src" + Http/Client.php → srcHttp/Client.php)。
-
"src/"✅ 推荐:明确表示目录,避免与同名文件冲突 -
"src"⚠️ 可能侥幸通过,但 Linux/macOS 下若存在src文件而非目录,就会失败 -
"./src/"❌ 不合法:Composer 不支持.或..开头的路径
类文件路径、命名空间、文件名三者必须严丝合缝
Composer 不扫描目录,也不“猜”你放哪了。它只做一件事:把 App\Http\Controllers\Home 拆成 App\ + Http\Controllers\Home,再把后半段的 \ 替换为 /,拼到 "src/" 后面,得到 src/Http/Controllers/Home.php。
- 声明的
namespace必须和composer.json中前缀完全一致,包括大小写:namespace App\Http;对应"App\": "src/",不是"app\" - 文件名必须和类名完全一致(PascalCase + 大小写敏感):
class ApiResponse→ 必须叫ApiResponse.php,不是apiresponse.php - 子目录结构必须严格对应剩余命名空间段:
App\Http\Controllers\Home→src/Http/Controllers/Home.php,不能是src/http/controllers/home.php
测试代码必须用 autoload-dev 单独配置
把 Tests\Feature\LoginTest 直接配进主 psr-4,会导致 composer install --no-dev 时仍加载测试类,浪费内存,还可能因依赖泄露引发线上异常。
- 正确做法:
"autoload-dev": { "psr-4": { "Tests\": "tests/" } } -
composer install --no-dev时,autoload-dev的映射不会写入autoload_psr4.php - CI/CD 中固定用
composer install --no-dev --optimize-autoloader,避免本地未提交的 autoload 文件污染部署
最容易被忽略的是:修改 composer.json 后,vendor/autoload.php 不会自动更新,它只负责加载已生成的映射表;而这个表是否包含你的新规则,取决于你有没有手动执行 composer dump-autoload -o——漏掉这一步,90% 的 “Class not found” 都白查。











