PSR-4 配置必须严格匹配三要素:命名空间前缀以双反斜杠结尾(如"App\\"),路径为相对目录且结尾带斜杠(如"src/"),修改后须执行composer dump-autoload生效。

PSR-4 配置必须写对这三处:命名空间结尾、路径写法、反斜杠转义
PSR-4 不是“写对了就能跑”,而是“错一处就 Class not found”。最常翻车的是 "App\" 这种写法——它会被 Composer 当作 PSR-0 处理或直接忽略;正确写法必须是 "App\\"(两个反斜杠),因为 JSON 解析需要转义。同理,目录路径不能以 / 开头(如 "/src/" 是绝对路径,非法),也不能用 src(缺末尾斜杠易拼成 srcMyClass.php)。真实有效的映射只有一种形式:"App\\": "src/"。
- 命名空间前缀必须以双反斜杠结尾(
"MyApp\\"),不是单斜杠、不是无斜杠 - 目录路径是相对于
composer.json所在位置的相对路径,结尾推荐带斜杠("src/") - 多个命名空间可并列配置,但每个键必须唯一,不能重复前缀(如同时写
"App\\"和"App\\Controller\\")
类文件路径与 namespace 必须严格一对一映射
Composer 不扫描目录,也不猜命名;它只做一件事:把 App\\Controller\\Home 拆成 App\ + Controller\Home,再拼到 src/ 后面,得到 src/Controller/Home.php。所以文件名必须叫 Home.php,不能是 HomeController.php 或 home.php;目录必须是 src/Controller/,不能是 src/controllers/(Linux 下大小写敏感)。
- 类名 = 文件名(不含
.php),大小写完全一致 - namespace 剩余部分(去掉前缀后)= 目录路径 + 文件名,中间用
/拼接 - 软链接、IDE 自动生成的嵌套命名空间(如
App\\Http\\Controllers\\V1\\User)必须对应真实路径src/Http/Controllers/V1/User.php
修改 composer.json 后,不运行 dump-autoload 就等于没改
vendor/autoload.php 不会监听 composer.json 变化,它只读取 vendor/composer/autoload_psr4.php 这个生成文件。你改完配置却忘了执行命令,90% 的 “找不到类” 都卡在这一步。
- 开发中执行:
composer dump-autoload(基础重建) - 生产环境或追求性能时加
-o参数:composer dump-autoload -o,跳过运行时路径拼接,生成静态 classmap - CI/CD 中应固定使用:
composer install --no-dev --optimize-autoloader,避免本地未提交的 autoload 文件干扰部署
autoload-dev 专用于测试代码,别和 autoload 混用
测试类(比如 MyApp\\Tests\\Feature\\LoginTest)不该进生产自动加载表。用 autoload-dev 单独配,既隔离作用域,又防止测试代码被误引入线上流程。
- 测试命名空间配在
"autoload-dev": { "psr-4": { "MyApp\\Tests\\": "tests/" } } - 运行
composer dump-autoload默认同时处理autoload和autoload-dev - 若只想重载主代码(跳过测试),加
--no-dev:composer dump-autoload --no-dev
真正难的从来不是写配置,而是让命名空间、目录结构、文件名三者像齿轮一样咬合严丝合缝。漏一个反斜杠、错一个大小写、少一次 dump-autoload,就会在某个深夜的部署里突然报错——而错误信息永远只说 Class not found,从不告诉你哪里没对上。










