name字段必须为全小写、vendor/name格式,含大写或非法字符会导致invalid package name错误;即使本地开发,格式错误也会使psr-4自动加载静默失效,最终报class not found。

name 字段写错会导致 autoload 失效但报错不提示
Composer 用 name 字段唯一标识包,不是“项目名”,也不是给人看的别名。它必须是全小写、两段式、短横线分隔的 vendor/name 格式,比如 "acme/blog-engine" 或 "local/cli-tool"。
常见错误包括:"MyApp"(含大写)、"my_app"(下划线)、"123app"(数字开头)、"acme/my-app/src"(带路径)。这些都会让 composer install 直接失败,报错形如:Invalid package name "MyApp": package names must be lowercase and consist of words separated by dashes.
- 即使不发布到 Packagist,
composer validate也会校验它;漏填或格式错,psr-4自动加载大概率静默失效,但运行时报的却是Class not found,排查时容易绕远 - 本地开发建议先跑
composer init,它会自动探测src/并生成合规的name和autoload映射
psr-4 映射末尾反斜杠和路径斜杠缺一不可
psr-4 不是“看着像就行”的配置。命名空间声明末尾必须有反斜杠,路径末尾必须有正斜杠,二者少一个,Composer 就会拼错类文件路径。
正确写法:"App": "src/"(注意 JSON 中需双反斜杠);错误写法:"App": "src/"(无结尾反斜杠 → 尝试加载 AppFoo 而非 AppFoo),或 "App": "src"(路径缺结尾斜杠 → 某些系统拼成 srcFoo.php)。
- 类文件路径必须严格匹配:例如
"App\": "src/"要求类AppHttpController必须在src/Http/Controller.php,且该文件首行必须是namespace AppHttp; - 改完
autoload后必须手动执行composer dump-autoload,install或update不会自动触发这步 - 验证是否生效:别只看命令成功与否,实际
new AppHttpController()才算真通过
require 和 require-dev 的分界线是「运行时是否 new/use」
这两个字段决定包是否被安装,不控制运行时行为。关键判断标准是:你的业务代码(src/ 或 app/ 下)会不会 new 它、use 它、调它的方法?而不是“本地用还是线上用”。
-
require放运行时真正依赖的包,比如"guzzlehttp/guzzle": "^7.0";漏掉会导致Class not found或Call to undefined function -
require-dev放测试、格式化、生成代码等工具,比如"phpunit/phpunit": "^9.5";CI 环境若用了--no-dev,这些包就完全不可见 - 某些包(如
symfony/console)可能同时用于开发和运行时,得看你代码里是否在生产环境调用它——不是看包名,而是看调用链
platform 字段必须和 require 同级,config.platform 无效
想锁定 PHP 版本或扩展版本让 CI 安装一致的依赖?config.platform 是常见误写,它完全被忽略。唯一生效的是顶层 platform 字段,且必须与 require 同级。
正确写法:"platform": {"php": "7.4.33", "ext-gd": "8.0.0"};错误写法:"config": {"platform": {"php": "8.1.0"}} —— Composer v2+ 已彻底移除对该结构的解析。
-
platform只影响依赖解析过程,不改变你本地 PHP 实际版本,也不影响运行时行为 - 验证是否生效:运行
composer show php看显示的仍是本地版本,但composer install后vendor/composer/installed.json中的包版本应匹配platform声明的环境 - CI 构建中若依赖版本漂移,优先检查这个字段位置是否写对,而不是怀疑镜像或缓存











