Doctrine ORM 负责实体与数据库表的映射,Composer 仅负责安装依赖并配置自动加载;映射生效需正确配置元数据路径和 autoload,与 Composer 的 type 字段无关。

Composer 本身不提供“原子数据映射”操作——这个说法混淆了概念。你真正想做的,大概率是用 Doctrine ORM(或其他 ORM)做实体与数据库表的映射,而 Composer 只负责安装 Doctrine 这个包。
composer require doctrine/orm 后,映射才开始生效
Doctrine 的映射(比如 @Entity、@Table、@Column)是 PHP 注解或 YAML/PHP 配置定义的运行时行为,和 Composer 无关。Composer 只管把 doctrine/orm 下载进 vendor/ 并注册自动加载。
- 执行
composer require doctrine/orm后,vendor/autoload.php才能加载 Doctrine 类 - 实体类必须被
Setup::createAnnotationMetadataConfiguration()显式注册路径,否则注解不会被扫描 - 映射失败常见现象:
Class "AppEntityUser" is not a valid entity or mapped super class——多半是路径没加进元数据配置,不是 Composer 没装好
为什么在 composer.json 里写 "type": "library" 不影响映射
Composer 的 type 字段只影响 create-project 或插件发现逻辑,对 Doctrine 的类扫描完全无感。哪怕你把实体包设成 "type": "project",Doctrine 该找不到还是找不到。
- Doctrine 只认
EntityManager初始化时传入的 metadata driver 配置 -
type是 Composer 内部调度用的,ORM 层根本看不到它 - 误以为改
type能触发映射,本质是混淆了依赖管理与运行时元数据发现
autoload 配置错,映射直接静默失效
Doctrine 扫描不到实体类,90% 是因为 composer.json 里 autoload 没配对路径,导致 class_exists('AppEntityUser') 返回 false。
- 必须确保实体所在目录进了
"autoload": {"psr-4": {"App\": "src/"}} - 改完
composer.json后要立刻跑composer dump-autoload,否则新映射不生效 - 如果用了
composer install --no-autoloader(如某些 CI 场景),映射必然失败,且无明确报错
真正决定映射是否“原子”的,是 Doctrine 的 EntityManager 和 UnitOfWork 机制;Composer 唯一该干的事,就是把那个 .phar 或 vendor/ 目录干净、确定地摆到位——它连数据库连接都不碰。


















