phpsoftbox / yandex-market
Yandex Market Partner API client component for the PhpSoftBox framework
Requires
- php: ^8.5
- phpsoftbox/collection: dev-master
- psr/http-client: ^1.0
- psr/http-factory: ^1.0
- psr/http-message: ^2.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.93
- phpsoftbox/cli-app: dev-master
- phpsoftbox/code-generator: dev-master
- phpsoftbox/cs-fixer: ^1.1.0
- phpsoftbox/http-message: dev-master
- phpunit/phpunit: ^11.2
- symfony/yaml: ^7.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-08-31 09:58:04 UTC
README
About
phpsoftbox/yandex-market — API-клиент Yandex Market Partner API на базе PSR-18.
Компонент включает:
YandexMarketApiClientс auth черезApi-KeyилиAuthorization: Bearer;- универсальные HTTP-методы
get/post/put/patch/delete/request; - helper версии API:
v1()иv2(); - ответы в
YandexMarketApiResponse, совместимом сPhpSoftBox\Collection\Collection; YandexMarketApiResponse::makeDto()для явного преобразования ответа в DTO после генерации карты;YandexMarketExceptionсо статусом и payload.
Источник спецификации
- документация:
https://yandex.ru/dev/market/partner-api/doc/ru/concepts/openapi - OpenAPI git:
https://github.com/yandex-market/yandex-market-partner-api(openapi/openapi.yaml)
Quick Start
use PhpSoftBox\Http\Message\RequestFactory; use PhpSoftBox\Http\Message\StreamFactory; use PhpSoftBox\YandexMarket\YandexMarketApiClient; $client = new YandexMarketApiClient( token: $_ENV['YANDEX_MARKET_API_KEY'], httpClient: $psr18Client, requestFactory: new RequestFactory(), streamFactory: new StreamFactory(), ); $orders = $client->v2('campaigns/123')->get('/orders', [ 'limit' => 50, ]);
Повтор запросов при превышении лимита
Клиент автоматически повторяет запросы после rate-limit ответов Yandex Market:
420 Enhance Your Calm, используемого актуальным Partner API;429 Too Many Requestsдля совместимости с другими контурами API.
Повтор разрешён для всех HTTP-методов и выполняется только после фактически полученного rate-limit ответа. Сетевые ошибки, timeout и остальные HTTP-статусы сохраняют прежнее поведение.
По умолчанию выполняется не более четырёх попыток, включая первоначальный запрос. Без корректного заголовка применяются задержки 1, 2 и 4 секунды. Клиент понимает:
Retry-After— секунды либо HTTP-date;X-RateLimit-Retry— секунды;X-RateLimit-Resource-Until— абсолютную дату RFC822, после которой ресурс снова станет доступен.
Если сервер передал несколько ограничений, выбирается наибольшая задержка. Для
X-RateLimit-Resource-Until она может быть длительной. Если синхронному процессу
нельзя столько ждать, установите maxAttempts: 1 или исключите запрос через policy.
Тело каждого повтора создаётся заново из сохранённого JSON, поэтому запрос полностью воспроизводится даже после чтения предыдущего body stream.
Настройка retry
use PhpSoftBox\YandexMarket\YandexMarketApiClient; use PhpSoftBox\YandexMarket\Retry\RateLimitRetryOptions; use PhpSoftBox\YandexMarket\Retry\YandexMarketRetryEvent; $client = new YandexMarketApiClient( token: $token, httpClient: $psr18Client, requestFactory: $requestFactory, streamFactory: $streamFactory, rateLimitRetry: new RateLimitRetryOptions( maxAttempts: 4, onRetry: static function (YandexMarketRetryEvent $event): void { // Доступны attempt, delaySeconds, method, endpoint и statusCode. }, ), );
Для тестов можно передать SleeperInterface. Точечные исключения настраиваются через
CallbackRetryableRequestPolicy, а сложные правила — собственной реализацией
RetryableRequestPolicyInterface:
use PhpSoftBox\YandexMarket\Retry\CallbackRetryableRequestPolicy; use Psr\Http\Message\RequestInterface; $retry = new RateLimitRetryOptions( requestPolicy: new CallbackRetryableRequestPolicy( static fn (RequestInterface $request): bool => $request->getUri()->getPath() !== '/custom/non-retryable', ), );
DTO ответы
Wrapper-методы остаются совместимыми с Collection. Если для endpoint-а есть сгенерированный DTO, response можно явно преобразовать:
$orders = $client->v2('campaigns/123')->get('/orders')->makeDto();
Генерация DTO
Генератор ожидает локальный OpenAPI YAML/JSON файл. По умолчанию используется docs/openapi.yaml:
vendor/bin/psb yandex-market:openapi:generate-dto
Можно указать путь явно:
vendor/bin/psb yandex-market:openapi:generate-dto --spec=docs/openapi.yaml
Команда обновляет src/Dto и src/Dto/YandexMarketResponseDtoMap.php. Wrapper-классы не меняются: основной контракт остается YandexMarketApiResponse/Collection, а DTO создаются явно через makeDto().