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
Скрипт інтерактивний і запитує:
Enter API vendor name:— назва постачальника API; стане частиною простору імен (порожньо —SDK).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.* |
Генерувати лише синхронну версію |
Префікси ~ і & разом у масці — помилка генерації.