psr-4映射需严格匹配:前缀必须为"app"而非"app",路径写为"src/"而非"src"或"/src/",命名空间、文件名、目录结构须完全一致,且每次修改后必须执行composer dump-autoload。

PSR-4 映射不是“配完就能用”,错一个反斜杠、少一次 dump-autoload,Class not found 就立刻报给你——它不提示、不妥协、不猜测。
为什么 "App" 和 "App\" 完全不同
Composer 严格按字符串字面匹配命名空间前缀。"App" 不是合法 PSR-4 前缀,会被降级为 PSR-0 兼容模式(已废弃)或直接忽略;只有 "App\" 才被识别为有效前缀。JSON 解析后,"App\" 变成 App,作为命名空间分隔符的起点。
-
"App"❌:匹配不到任何带命名空间的类,比如new AppHttpControllerHome();会失败 -
"App\"✅:正确触发 PSR-4 路径拼接逻辑 -
"AppController\"和"App\"不能共存——后者覆盖前者,子命名空间永远无法命中
路径值怎么写才安全
路径是相对于 composer.json 所在目录的子路径,必须真实存在且大小写敏感。结尾加 / 是明确无歧义的写法,避免与同名文件冲突。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
-
"src"⚠️:侥幸通过但危险,若恰好存在src文件(非目录),自动加载直接失效 -
"src/"✅:推荐写法,语义清晰,Composer 内部处理更稳定 -
"/src/"❌:以/开头被视为绝对路径,报Invalid path -
"../lib/"✅:允许上层路径,但需确保部署时该路径存在且可读
类文件位置、命名空间、文件名三者必须严丝合缝
Composer 不扫描目录,也不做大小写转换或别名推导。它只做一件事:把 AppHttpControllersHome 拆成前缀 App + 剩余部分 HttpControllersHome,再把点号替换成 /,拼到路径后得到 src/Http/Controllers/Home.php。
- 命名空间声明必须是
namespace AppHttpControllers;,不能是apphttpcontrollers或AppHttpControllers(末尾多一个反斜杠) - 类文件必须叫
Home.php,不能是home.php或HomeController.php - 实际路径必须是
src/Http/Controllers/Home.php,不能是src/http/controllers/home.php(Linux/macOS 下大小写敏感,直接 404) - 子命名空间不能单独映射,必须靠目录结构对齐:
"App\" → "src/",则AppUtilsHelper必须放在src/Utils/Helper.php
改完 composer.json 后类还是找不到?
因为 vendor/autoload.php 不读配置文件,它只加载 vendor/composer/autoload_psr4.php —— 这个文件由 composer dump-autoload 生成。没运行这一步,所有修改都无效。
- 开发中每次改完
autoload或autoload-dev,必须执行composer dump-autoload -o - CI/CD 部署时应固定用
composer install --no-dev --optimize-autoloader,避免本地未提交的 autoload 文件污染线上 - 仍报错?先运行
composer show --platform确认当前 autoloader 是否已更新,再检查vendor/composer/autoload_psr4.php里有没有你预期的映射项 - 测试类(如
TestsUnitExampleTest)必须配在"autoload-dev"下,否则composer install --no-dev时不会加载,但本地开发可能误用
最常被忽略的是:Composer 从不校验你写的路径是否存在,"sr/" 写成 "src/" 不报错,但类就永远消失;它也不检查命名空间和文件名是否一致,全靠你手动对齐——错一个字符,就是 Class not found。










