ybelenko/openapi-data-mocker

从Swagger 2.0|Openapi 3.0规范生成假数据的库

1.1.0 2021-08-05 11:10 UTC

This package is auto-updated.

Last update: 2024-09-22 01:28:52 UTC


README

Latest Stable Version Build Status Coverage Status License

Openapi Data Mocker帮助从OpenAPI 3.0文档生成假数据。大部分方法可能与2.0版本(即Swagger 2.0)兼容,但未经测试。这个包是OpenAPI Generator项目(在OpenAPI Generator)中PHP Slim4服务器的增强,但更容易在单独的存储库中维护。

要求

  • PHP ^7.3

重要提示!虽然composer.json中声明了PHP 8.0,但此包尚未针对它进行测试。

通过Composer安装

在终端运行

composer require ybelenko/openapi-data-mocker

用法示例

假设我们有一个如下的OpenAPI规范3.0.3 - 模式对象

description: Real world example schema
type: object
properties:
  id:
    type: integer
    format: int32
    minimum: 1
  purchased_items:
    type: array
    items:
      type: object
      properties:
        SKU:
          type: string
          format: uuid
          maxLength: 20
        quantity:
          type: integer
          format: int32
          minimum: 1
          maximum: 5
        price:
          type: object
          properties:
            currency:
              type: string
              minLength: 3
              maxLength: 3
              enum:
              - USD
              - EUR
              - RUB
            value:
              type: number
              format: float
              minimum: 0.01
              maximum: 99.99
        manufacturer:
          type: object
          properties:
            name:
              type: string
              maxLength: 30
            country:
              type: string
              enum:
              - CHN
              - USA
              - RUS
  buyer:
    type: object
    properties:
      first_name:
        type: string
        minLength: 3
        maxLength: 15
      last_name:
        type: string
        minLength: 3
        maxLength: 15
      credit_card:
        type: integer
        minimum: 1000000000000000
        maximum: 10000000000000000
      phone:
        type: integer
        minimum: 10000000000000
        maximum: 99999999999999
      email:
        type: string
        format: email
  status:
    type: string
    enum:
    - registered
    - paid
    - shipped
    - delivered
    default: registered
  created_at:
    type: string
    format: date-time

注意!虽然模式对象以YAML格式呈现,但这个库目前不支持YAML或JSON解析。这意味着mockSchemaObject方法期望传入已解码的JSON值作为参数。

当我们使用mockSchemaObject方法模拟上述模式时

require __DIR__ . '/vendor/autoload.php';

use OpenAPIServer\Mock\OpenApiDataMocker as Mocker;
$mocker = new Mocker();
// set model classes namespace for $ref handling
// current example doesn't use $refs in schemas, however
$mocker->setModelsNamespace('JohnDoesPackage\\Model\\');
// class InvoiceTest contains schema mentioned previously
// it returns that schema with getOpenApiSchema() method declared in OpenAPIServer\Mock\BaseModel parent class
$schema = \OpenAPIServer\Mock\Model\InvoiceTest::getOpenApiSchema();
$data = $mocker->mockSchemaObject($schema);
echo json_encode($data, \JSON_PRETTY_PRINT);

输出如下

{
    "id": 1912777939,
    "purchased_items": [
        {
            "SKU": "5ee78cfde9f05",
            "quantity": 4,
            "price": {
                "currency": "EUR",
                "value": 57.635
            },
            "manufacturer": {
                "name": "Lorem i",
                "country": "USA"
            }
        }
    ],
    "buyer": {
        "first_name": "Lorem ipsum do",
        "last_name": "Lorem ipsum ",
        "credit_card": 2455087473915908,
        "phone": 65526260517693,
        "email": "jfkennedy@example.com"
    },
    "status": "delivered",
    "created_at": "1978-08-08T04:03:09+00:00"
}

当然,每次调用输出的内容都会略有不同。这正是mocker包被开发出来的原因。

您可以在examples/extended_example.php中查看扩展示例。

支持的功能

除了特定的字符串格式(例如emailuuidpassword,这些格式实现得不好)之外,支持所有数据类型。

数据类型支持

数据选项支持

已知限制

避免在模式中循环引用。下面的模式会导致无限循环和Out of Memory PHP错误

# ModelA has reference to ModelB while ModelB has reference to ModelA.
# Mock server will produce huge nested JSON example and ended with `Out of Memory` error.
definitions:
  ModelA:
    type: object
    properties:
      model_b:
        $ref: '#/definitions/ModelB'
  ModelB:
    type: array
    items:
      $ref: '#/definitions/ModelA'

不要引用标量类型,因为生成器不会产生模拟服务器可以找到的模型。所以下面的模式会导致错误

# generated build contains only `OuterComposite` model class which referenced to not existed `OuterNumber`, `OuterString`, `OuterBoolean` classes
# mock server cannot mock `OuterComposite` model and throws exception
definitions:
  OuterComposite:
    type: object
    properties:
      my_number:
        $ref: '#/definitions/OuterNumber'
      my_string:
        $ref: '#/definitions/OuterString'
      my_boolean:
        $ref: '#/definitions/OuterBoolean'
  OuterNumber:
    type: number
  OuterString:
    type: string
  OuterBoolean:
    type: boolean

提到的技术链接