Composer不支持直接配置多级src目录,但可通过psr-4多命名空间映射或classmap实现等效效果;推荐用psr-4将不同命名空间映射到src子目录,注意前缀覆盖顺序;若需并列多个物理根目录且无统一命名空间,则用classmap;务必区分autoload与autoload-dev,修改后须运行composer dump-autoload。

Composer 本身不支持直接在 autoload 中配置“多级 src 目录”(比如同时加载 src/ 和 src/Models/ 作为独立根),但可以通过合理使用 psr-4 映射或 classmap 实现等效效果。关键不是加多个 src 路径,而是把不同命名空间映射到不同子目录。
psr-4 映射多个命名空间到不同 src 子目录
这是最推荐的方式:用多个 psr-4 条目,将不同命名空间分别指向 src 下的子目录。Composer 会按顺序匹配命名空间前缀,所以要注意前缀长度和覆盖关系。
- 如果
App\\映射到src/,而App\Models\\映射到src/Models/,后者会失效——因为App\\已经覆盖了全部App\*类 - 正确做法是让子命名空间映射更具体的路径,并确保父命名空间不覆盖子路径
- 实际常用结构是:一个顶层命名空间对应整个
src/,子模块通过子命名空间自然落在对应子目录下(无需额外映射)
{
"autoload": {
"psr-4": {
"App\\": "src/",
"Tests\\": "tests/"
}
}
}
这样 App\Models\User 自动加载 src/Models/User.php,App\Services\Payment 加载 src/Services/Payment.php——根本不需要单独为 Models 或 Services 写映射。
需要真正并列多个“src 级别”目录时用 classmap
当项目存在物理上分离的多个代码根(如 src/、legacy/、vendor-custom/),且它们没有统一命名空间前缀,classmap 是唯一可靠方式。它不依赖命名空间,只扫描文件并生成类名 → 文件路径的静态映射。
-
classmap不支持自动发现新增类,每次增删文件后必须运行composer dump-autoload - 路径可以是目录或具体文件,支持递归扫描
- 优先级低于
psr-4,但对无命名空间或传统require风格代码最友好
{
"autoload": {
"psr-4": {
"App\\": "src/"
},
"classmap": [
"legacy/",
"shared/Utils.php"
]
}
}
避免常见错误:autoload-dev 和 dump-autoload 的陷阱
开发专用自动加载(如测试类)必须放在 autoload-dev,否则生产环境也会加载,可能引发路径错误或性能问题。
- 误把
tests/放进autoload而非autoload-dev,导致composer install --no-dev后仍尝试加载测试类,报错Class Tests\TestCase not found - 修改
composer.json后忘记运行composer dump-autoload,尤其改了classmap或新增psr-4条目时,变更不会生效 - 使用
composer install时若已有vendor/autoload.php,它不会重新生成 autoload map——必须显式触发 dump
真正难处理的不是“怎么写多个路径”,而是命名空间设计是否清晰、目录结构是否与 PSR-4 语义一致。一旦命名空间和目录脱节,再加十行 psr-4 映射也救不回来。










