docs: rewrite JsonRpcBundle docs, add SDK docs, move them under docs/api
uk/docs/api/sdk/bundle/usage.md
новий файл +70
−0
Використання SDK Bundle
Синхронні виклики
Згенеровані класи автоматично стають сервісами застосунку (з тегом ufo.sdk_method_class), тож їх достатньо запросити в конструкторі:
use App\Sdk\Orders\UserSDK;
final class UserProfileService
{
public function __construct(private UserSDK $users) {}
public function profile(int $id): UserDto
{
return $this->users->withoutCache()->get($id);
}
}
Під час компіляції контейнера бандл (SdkCompiler) для кожного класу:
- знаходить постачальника за простором імен класу;
- передає заголовок
[token_key => token], якщо обидва параметри задано; - передає обробники відповіді — сервіси з тегом
ufo.sdk_response_handler, впорядковані за пріоритетом (так можна додати власний).
Методи, fluent-параметри (withoutCache(), rayId(), withHeaders()), формат результату й обробка помилок — як у Client SDK.
Асинхронні виклики
Класи Async*SDK отримують з конфігурації token і async_secret, а також сервіс Ufo\Component\TransportContracts\AsyncTransportFactory, який бандл реєструє сам. Йому потрібен хоча б один resolver транспорту — для RabbitMQ:
composer require ufo-tech/component-transport-amqp
# config/services.yaml
services:
Symfony\Component\Messenger\Bridge\Amqp\Transport\AmqpTransportFactory: ~
Ufo\Component\AsyncAmqpTransport\AMQPTransportResolver:
autowire: true
autoconfigure: true # тег ufo.async_transport_resolver
public function __construct(private AsyncReportSDK $reports) {}
$this->reports->callbackTo('https://my-app.example.com/rpc-callback')->build($month); // true
Пакет AMQP — бібліотека, а не бандл, тож resolver реєструється в сервісах застосунку вручну. Без жодного resolver-а виклик завершиться TransportNotFoundException. Особливості асинхронних викликів — Client SDK: асинхронні виклики.
У 3.x асинхронні класи працювали напряму з Symfony Messenger (TransportFactoryInterface) і окремого resolver-а не потребували. Під час оновлення до 4.0 додайте resolver і перегенеруйте SDK.
Помилки
- Помилки сервера й транспорту —
Ufo\RpcSdk\Exceptions\SdkExceptionз типізованим винятком уgetPrevious()— див. Client SDK. - Немає адреси постачальника в
sdk_config.yaml(.dist)—ConfigNotFoundException.
Якщо клас лежить поза простором імен налаштованого постачальника (наприклад, згенерований ufo:sdk:make для постачальника, якого немає в vendors), бандл мовчки не передасть йому ні токен, ні обробники. Симптом — помилка токена -32401 від сервера. Див. Актуальні помилки.
Тестування
Згенеровані класи — звичайні сервіси, тож у тестовому оточенні їх можна перевизначити заглушками (config/services_test.yaml). У модульних тестах клас можна створити вручну з Symfony MockHttpClient в аргументі $httpClient.