phpsoftbox / yandex-market
Yandex Market Partner API client component for the PhpSoftBox framework
Requires
- php: ^8.5
- phpsoftbox/collection: ^1.0
- psr/http-client: ^1.0
- psr/http-factory: ^1.0
- psr/http-message: ^2.0
Requires (Dev)
- phpsoftbox/cli-app: ^1.0
- phpsoftbox/code-generator: ^1.0
- phpsoftbox/cs-fixer: ^1.2.2
- phpsoftbox/http-message: ^1.0
- phpunit/phpunit: ^13.3
- symfony/yaml: ^7.0
Suggests
- phpsoftbox/cli-app: Required for the yandex-market:openapi:generate-dto DTO generator command (maintainer tooling).
- phpsoftbox/code-generator: Required for DTO generation from OpenAPI (maintainer tooling).
- symfony/yaml: Required to read YAML OpenAPI specs during DTO generation.
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-09-29 11:57:42 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 она может быть длительной, поэтому по умолчанию действуют
два бюджета:
- одна задержка — не более 30 секунд (
maxDelaySeconds); - сумма задержек одного вызова клиента — не более 60 секунд (
maxTotalDelaySeconds).
Задержка не обрезается до лимита: более ранний повтор противоречил бы заголовку. Вместо
ожидания клиент выбрасывает YandexMarketException со статусом последнего ответа (420/429)
и его payload. null в параметре отключает соответствующее ограничение.
Тело каждого повтора создаётся заново из сохранённого 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, maxDelaySeconds: 30.0, maxTotalDelaySeconds: 60.0, 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
Генератор — инструмент сопровождения пакета: ему нужны phpsoftbox/cli-app, phpsoftbox/code-generator, symfony/yaml
(в suggest, в require не входят). Клиенту API эти зависимости не нужны.
Генератор ожидает локальный 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().