Використання SDK
Згенерований клас процедури — звичайний PHP-клас. У Symfony з SDK Bundle його достатньо отримати через автовайринг; без бандла — створити вручну.
Синхронний виклик
use App\Sdk\Orders\UserSDK;
$users = new UserSDK(headers: ['Ufo-RPC-Token' => $token]);
$user = $users->get(5); // App\Sdk\Orders\DTO\UserDto
$list = $users->list(page: 2); // UserDto[]
Конструктор:
new UserSDK(
array $headers = [], // HTTP-заголовки, зокрема токен
string|int|null $requestId = null, // id запиту; за замовчуванням uniqid()
string $rpcVersion = '2.0',
?HttpClientInterface $httpClient = null, // власний Symfony HttpClient
array $httpRequestOptions = [], // опції HttpClient (timeout, proxy, ...)
?IRpcSpecialParamHandler $rpcSpecialParams = null,
iterable $handlers = [], // обробники відповіді; порожньо — стандартні
string $transportName = 'sync', // ключ адреси в sdk_config.yaml
)
Назва заголовка з токеном не фіксована — вона така, як на сервері (security.token_name, за замовчуванням Ufo-RPC-Token).
Адреса сервера
Адреса береться з sdk_config.yaml (якщо є) або sdk_config.yaml.dist поруч із класами — за назвою постачальника (останній сегмент простору імен класу) і transportName. Немає запису — ConfigNotFoundException.
Fluent-методи
| Метод | Що робить |
|---|---|
withHeaders(array $headers) |
Додати заголовки до наступних запитів (лише синхронні класи) |
withoutCache() / withCache() |
Передати серверу $rpc.ignoreCache: true / false — обійти або використати кеш відповіді |
rayId(string $id) |
Передати $rpc.rayId для трасування ланцюжка запитів |
setId(string|int $id) / setRequestId() |
Задати id запиту |
resetConfig() |
Скинути спеціальні параметри |
$user = $users->withoutCache()->rayId($traceId)->get(5);
Синхронні класи скидають спеціальні параметри й генерують новий id після кожного успішного запиту. Кожен запит містить $rpc (timeout, ignoreCache і, якщо задано, rayId, callback); сервери на JsonRpcBundle його розуміють, інші сервери отримують додатковий параметр.
Результат
Тип результату визначається з @return згенерованого методу, і відповідь сервера перетворюється на нього ланцюжком обробників:
| Обробник | Пріоритет | Що перетворює |
|---|---|---|
EnumResponseHandler |
100 | значення → case enum |
UnionResponseHandler |
80 | union-типи |
CollectionResponseHandler |
60 | масиви елементів |
DtoResponseHandler |
20 | об'єкти → DTO |
Власні обробники — див. Розширення.
Помилки
- Валідація параметрів виконується до запиту за обмеженнями з документації сервера. Порушення —
Ufo\RpcError\ConstraintsImposedException(або іншийAbstractRpcErrorExceptionза кодом) без обгортки. - Помилки сервера й транспорту загортаються в
Ufo\RpcSdk\Exceptions\SdkException: йогоgetCode()— код помилки JSON-RPC, а типізований винятокrpc-exceptions(наприклад,RpcDataNotFoundExceptionдля-32404) — уgetPrevious().
use Ufo\RpcError\RpcDataNotFoundException;
use Ufo\RpcSdk\Exceptions\SdkException;
try {
$user = $users->get($id);
} catch (SdkException $e) {
if ($e->getPrevious() instanceof RpcDataNotFoundException) {
// користувача немає
}
throw $e;
}
Не ловіть RpcDataNotFoundException та інші винятки rpc-exceptions напряму — з синхронного виклику вони не вилітають, лише всередині SdkException.
Batch і notifications
SDK надсилає лише одиночні запити з id. Batch і notifications через згенеровані класи не підтримуються.
Налагодження
Ufo\RpcSdk\Procedures\RequestResponseStack::getAll() повертає всі запити, заголовки й відповіді поточного процесу.
getLastStack(), getLastRequest() і getLastResponse() у 5.0.2 працюють неправильно — див. Актуальні помилки. Використовуйте getAll().