如何将JSONSchema(draft7)转换为Swagger3以生成PHP Doctrine实体
JSONSchema批量生成Doctrine实体落地指南
一、JSONSchema转OpenAPI 3(Swagger3)实现方案
OpenAPI 3的Schema定义本身是JSON Schema Draft 7的超集,99%的Draft7关键字都可以直接兼容,转换逻辑非常轻量,完全可以自行实现批量转换,不需要依赖第三方重型库,核心逻辑如下:
- 准备基础OpenAPI 3模板,把所有JSON Schema文件内容批量填充到模板的
components.schemas节点下,仅需做极少量兼容调整即可 - 若你的JSON Schema存在跨文件
$ref引用,可先用justinrainbow/json-schema库的Resolver工具完成引用解析后再填充
极简批量转换代码示例:
// 初始化OpenAPI 3基础模板 $openapiTemplate = [ 'openapi' => '3.0.0', 'info' => [ 'title' => 'SOAP入站消息模型库', 'version' => '1.0.0' ], 'paths' => new stdClass(), 'components' => [ 'schemas' => [] ] ]; // 批量遍历JSON Schema目录 foreach (glob('/path/to/your/jsonschema/*.json') as $schemaFile) { $schemaContent = json_decode(file_get_contents($schemaFile), true); $schemaName = basename($schemaFile, '.json'); // 非特殊场景无需修改Schema内容,直接填充即可 $openapiTemplate['components']['schemas'][$schemaName] = $schemaContent; } // 输出最终OpenAPI 3文件 file_put_contents( '/path/to/output/openapi.json', json_encode($openapiTemplate, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) );
二、基于OpenAPI文件生成Doctrine实体
你选择的转OpenAPI再通过Api Platform Schema Generator生成实体的方案是最优解,生成前调整Schema Generator的配置项即可得到无冗余、包含完整关联和校验规则的实体:
- 开启
doctrineAnnotations: true:自动生成Doctrine ORM相关注解 - 开启
validationAnnotations: true:自动将JSON Schema中的校验规则(长度、格式、取值范围等)转换为Symfony Validation注解 - 开启
associations: true:自动识别Schema中的嵌套对象、引用关系,生成对应的OneToMany/ManyToOne等关联注解 - 开启
generateGetterSetter: true:自动生成类属性的存取方法,无需手动补充
三、备选方案参考
- 先用Swaggest生成PHP模型再转实体:需要自行开发注解注入逻辑,批量处理成本比转OpenAPI方案高30%左右,仅适合不需要复用OpenAPI文件的场景
- 先转MySQL表结构再反向生成实体:大概率丢失JSON Schema中的细粒度校验规则,嵌套对象的关联关系容易生成错误,除非有自动建表的强需求否则不推荐
内容的提问来源于stack exchange,提问作者Jakub
相关产品推荐
相关产品推荐

