Генерація SDK

← Генерація SDK

Ashterix

docs: rewrite JsonRpcBundle docs, add SDK docs, move them under docs/api

uk/docs/api/sdk/client/generation.md новий файл +93 −0

Генерація SDK

SDK генерується з документа OpenRPC сервера. У JsonRpcBundle це відповідь GET /rpc (для інших версій — GET /rpc/v2 тощо).

У Symfony-застосунку генеруйте через SDK Bundle: bin/console ufo:sdk:generate. Нижче — генерація самою бібліотекою.

Скрипт bin/make.php

php vendor/ufo-tech/json-rpc-client-sdk/bin/make.php https://api.example.com/rpc

Скрипт інтерактивний і запитує:

  1. Enter API vendor name: — назва постачальника API; стане частиною простору імен (порожньо — SDK).
  2. Enter methods to ignore (comma separated): — маски (див. «Фільтр методів» нижче) методів, які не треба генерувати.

Аргумент — URL документації. Без нього скрипт читає bin/schema.json поруч зі скриптом. Документацію запитує простим GET без заголовків, тож захищену protected_doc документацію так не отримати — використайте SDK Bundle або HttpReader з заголовками в коді.

Скрипт генерує класи в простір імен Ufo\RpcSdk\Client\<Vendor> — опцій для іншого простору імен немає. Для власного простору імен використовуйте генератор з коду (нижче) або SDK Bundle.

Генерація з коду

use Ufo\RpcSdk\Maker\Definitions\Configs\ConfigsHolder;
use Ufo\RpcSdk\Maker\DocReader\HttpReader;

$configs = new ConfigsHolder(
    docReader: new HttpReader('https://api.example.com/rpc', ['Ufo-RPC-Token' => $token]),
    projectRootDir: __DIR__,
    apiVendorAlias: 'Orders',
    namespace: 'App\Sdk',
    cacheLifeTimeSecond: 3600,
    ignoredMethods: ['Admin.*'],
);

Далі Ufo\RpcSdk\Maker\Maker з генераторами SdkEnumMaker, SdkDtoMaker, SdkProcedureMaker, SdkConfigMaker (так робить bin/make.php і SDK Bundle). Файли пишуться в каталог, на який у composer.json зіставлено простір імен (PSR-4), тож простір імен має бути зареєстрований в автозавантаженні.

Документ OpenRPC кешується в var/cache/maker/ на cacheLifeTimeSecond секунд; після змін на сервері очистьте кеш або зменште час.

Що читається з документації

  • Підтримувані версії OpenRPC: 1.2.6, 1.3.0, 1.3.1, 1.3.2.
  • Адреса сервера — servers[0].url; асинхронні транспорти — servers[0].x-ufo.transport (сервер JsonRpcBundle публікує їх при docs.async_dsn_info: true).
  • Методи (methods), схеми DTO і enum (components.schemas), обмеження валідації (x-ufo-assertions).
  • Метод ping не генерується — він є в кожному класі.

Що генерується

Для постачальника Orders і простору імен App\Sdk:

Що Де Приклад
Класи процедур App\Sdk\Orders\ метод User.get → клас UserSDK, метод get()
Асинхронні класи App\Sdk\Orders\ AsyncUserSDK — лише якщо сервер публікує транспорт, назва якого починається з rpc_async
DTO App\Sdk\Orders\DTO\ UserDto
Enum App\Sdk\Orders\Enums\ OrderStatus з values(), fromValue(), tryFromValue()
Адреси серверів sdk_config.yaml.dist у корені простору імен див. нижче
  • Назва методу без роздільника потрапляє в клас MainSDK; назви методів переводяться в lowerCamelCase (types_list → typesList).
  • Кожен метод має атрибут #[ApiMethod('User.get')], параметри — #[RPC\Assertions] з обмеженнями сервера, застарілі методи — #[Deprecated].
  • Класи позначено тегами ufo.sdk_method_class / ufo.async_sdk_method_class — за ними SDK Bundle налаштовує сервіси.
  • Повторна генерація видаляє й переписує файли класів — не редагуйте їх вручну.

sdk_config.yaml.dist

Orders:
    sync: 'https://api.example.com/rpc'
    rpc_async: 'amqp://{rpc_async_secret}@rabbit.example.com:5672/vhost/rpc'

Логін і пароль транспорту замінюються на плейсхолдер {<назва транспорту>_secret}; справжній секрет передається під час виконання. Записи інших постачальників у файлі зберігаються. Щоб змінити адреси для свого оточення, створіть поруч sdk_config.yaml — він має пріоритет над .dist.

Фільтр методів

Маски задаються списком через кому (у bin/make.php) або масивом (ignoredMethods, ignore_methods у SDK Bundle). Порівняння без урахування регістру.

Маска Значення
Admin.* Не генерувати методи, що підходять (* — будь-які символи)
!Admin.ping Завжди генерувати, навіть якщо підходить під іншу маску
~Report.* Генерувати лише асинхронну версію
&Cart.* Генерувати лише синхронну версію

Префікси ~ і & разом у масці — помилка генерації.

Версії та групи API

Окремої підтримки версій і груп API в SDK немає. Генеруйте з адреси потрібної версії або групи (/rpc/v2, /rpc/internal) — сервер підставляє її в servers[0].url. Для кожної версії чи групи використовуйте окрему назву постачальника, інакше класи перезапишуть одне одного.