Розширення SDK

← Розширення SDK

Ashterix

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

uk/docs/api/sdk/client/extending.md new file +70 −0

Розширення SDK

Джерело документації: IDocReader

namespace Ufo\RpcSdk\Maker\DocReader\Interfaces;

interface IDocReader
{
    public function getApiDocumentation(): array;   // декодований документ OpenRPC
}

Вбудовані: HttpReader(string $apiUrl, array $headers = []) — за URL, зокрема із заголовком токена для захищеної документації; FileReader(string $docFilePath) — з локального JSON. Власний читач (наприклад, документ з репозиторію чи об'єднання кількох) передається в ConfigsHolder.

Генератори: IMaker

namespace Ufo\RpcSdk\Maker\Interfaces;

interface IMaker
{
    public function make(?callable $callbackOutput = null): void;
}

Maker(ConfigsHolder $configs, Generator $generator, IMaker[] $makers) запускає генератори по черзі; $callbackOutput отримує кожне згенероване визначення (IClassLikeDefinition) — так виводиться перелік класів у консоль. Вбудовані: SdkEnumMaker, SdkDtoMaker, SdkProcedureMaker, SdkConfigMaker.

Власні шаблони

Окремої опції для шаблонів немає. Успадкуйте потрібний генератор і перевизначте властивість $template:

final class MyProcedureMaker extends SdkProcedureMaker
{
    protected string $template = __DIR__.'/templates/procedure.php';
}

Вбудовані шаблони лежать у templates/ пакета (procedure, sync_method, async_method, dto, enum, namespace, docs). Попри розширення .php.twig, це PHP-шаблони MakerBundle, не Twig.

Обробники відповіді: IResponseHandler

namespace Ufo\RpcSdk\Procedures\ResponseTransformer\Interfaces;

interface IResponseHandler   // тег ufo.sdk_response_handler, const int PRIORITY = 0
{
    public function canHandle(array $schema): bool;
    public function handle(array $schema, mixed $result, callable $transform, SdkResponseCreator $creator): mixed;
}

Обробник отримує JSON Schema очікуваного результату (з @return методу). Перший, чий canHandle() повернув true, перетворює значення; $transform рекурсивно обробляє вкладені значення. Передаються аргументом $handlers конструктора процедури; непорожній список повністю замінює стандартні, тож додавайте й вбудовані (EnumResponseHandler, UnionResponseHandler, CollectionResponseHandler, DtoResponseHandler). SDK Bundle збирає всі сервіси з тегом і впорядковує за PRIORITY.

Спеціальні параметри: IRpcSpecialParamHandler

Синхронні класи приймають власну реалізацію Ufo\RpcObject\IRpcSpecialParamHandler (аргумент $rpcSpecialParams) — наприклад, щоб автоматично додавати rayId з контексту трасування. За замовчуванням — Ufo\RpcSdk\Procedures\RpcSpecialParamHandler. Асинхронні класи власного обробника не приймають.

Асинхронні транспорти

Див. Асинхронні виклики: AsyncTransportResolverInterface / AbstractAsyncTransportResolver з пакета ufo-tech/component-transport-contracts.

Атрибути

Атрибут Де Призначення
#[ApiMethod('User.get')] метод Назва RPC-методу
#[ApiUrl($url, $method = 'POST')] клас Явна адреса сервера замість sdk_config.yaml (генератор його не створює — див. Актуальні помилки)
#[AsyncTransport($dsn)] — Допоміжний клас плейсхолдера секрету