Клиент OpenAPI PHP выдает фатальную ошибку с anyOf

Я пытаюсь создать автоматически созданный клиент PHP OpenAPI, используя свойства anyOf и allOf.

Цель состоит в том, чтобы иметь возможность возвращать массив с полиморфизмом в нем: объекты разных типов.
Также эти объекты также имеют общий базовый объект.

В моем примере схемы Items - это массив, элементы которого могут быть типов ItemOne или ItemTwo.
Оба типа элементов имеют собственное свойство (itemOneProperty и itemTwoProperty соответственно) и общее свойство baseItemProperty (которое унаследовано от BaseItem с ключевое слово allOf).

Вот yaml спецификации API:

openapi: 3.0.0
info:
  title: Test API
  version: 1.0.0
servers:
  - url: https://api.myjson.com/bins

paths:
  /roxgd:
    get:
      operationId: getItems
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Items'
components:
  schemas:

    Items:
      type: array
      items:
        anyOf:
          - $ref: '#/components/schemas/ItemOne'
          - $ref: '#/components/schemas/ItemTwo'

    BaseItem:
      type: object
      properties:
        baseItemProperty:
          type: string

    ItemOne:
      allOf:
        - $ref: '#/components/schemas/BaseItem'
        - type: object
          properties:
            itemOneProperty:
              type: string

    ItemTwo:
      allOf:
        - $ref: '#/components/schemas/BaseItem'
        - type: object
          properties:
            itemTwoProperty:
              type: string

Это конечная точка, на которую я отправляю запросы: https://api.myjson.com/bins/roxgd

И он возвращает этот пример json:

[
    {
        type: "ItemOne",
        baseItemProperty: "foo1",
        itemOneProperty: "bar1"
    },
    {
        type: "ItemTwo",
        baseItemProperty: "foo2",
        itemTwoProperty: "bar2"
    }
]

Клиент PHP генерируется без ошибок, но когда он вызывает метод getItems, я получаю эту фатальную ошибку:

PHP Fatal error:  Uncaught Error: Class 'AnyOfItemOneItemTwo' not found in /home/user/projects/openapi-test/lib/ObjectSerializer.php:309
Stack trace:
#0 /home/user/projects/openapi-test/lib/ObjectSerializer.php(261): MyRepo\OpenApiTest\ObjectSerializer::deserialize(Object(stdClass), 'AnyOfItemOneIte...', NULL)
#1 /home/user/projects/openapi-test/lib/Api/DefaultApi.php(182): MyRepo\OpenApiTest\ObjectSerializer::deserialize(Array, 'AnyOfItemOneIte...', Array)
#2 /home/user/projects/openapi-test/lib/Api/DefaultApi.php(128): MyRepo\OpenApiTest\Api\DefaultApi->getItemsWithHttpInfo()
#3 /home/user/projects/tests-for-openapi-test/test.php(10): MyRepo\OpenApiTest\Api\DefaultApi->getItems()
#4 {main}
  thrown in /home/user/projects/openapi-test/lib/ObjectSerializer.php on line 309

То же самое происходит, если я использую свойство oneOf, но получаю ошибку: Uncaught Error: Class 'OneOfItemOneItemTwo' not found....


Моя установка работает нормально, когда я использую любой другой допустимый yaml (без полиморфизма).

Кроме того, я уже проверил этот связанный вопрос, но это касается пользовательского интерфейса, который Я вообще не использую.

Вы знаете, где может быть ошибка? Ошибка в моем yaml doc? Ошибка в генераторе клиента PHP?

Изменить: я использую openapi-generator v4.0.3 (последняя версия на данный момент).


person nanocv    schedule 01.08.2019    source источник
comment
Возможно ли поделиться сгенерированным кодом? Не могли бы вы также проверить версию генератора openapi и какие-либо используемые флаги или дополнительную конфигурацию?   -  person ficuscr    schedule 05.08.2019
comment
Вы проверяли наличие класса php в сгенерированных файлах? Если класс существует, это может быть проблема версии PHP, с какой версией PHP вы запускаете файлы? В противном случае проблема может быть в генераторе.   -  person AltShiftZero    schedule 09.08.2019
comment
@ficuscr Больше не нужно делиться кодом. Я использую версию 4.0.3, где наследование на данный момент нарушено. Спасибо за помощь.   -  person nanocv    schedule 10.08.2019
comment
@DempseyvanWissen Отсутствующий класс даже не существует в проекте. Это связано с проблемой, которую я написал в ответе. Спасибо за помощь.   -  person nanocv    schedule 10.08.2019


Ответы (1)


После дополнительных исследований я обнаружил открытую проблему с наследованием в генераторе openapi, начиная с версии 4.0.0.

https://github.com/OpenAPITools/openapi-generator/issues/2845

person nanocv    schedule 10.08.2019