Використання SDK Bundle

Використання 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

У 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.