andy87 / sdk-php-client
SKD для создания клиентов отправляющих HTTP запросы к API.
dev-main
2025-06-27 07:48 UTC
Requires
- php: >=8.0
- ext-curl: *
- ext-http: *
This package is auto-updated.
Last update: 2025-06-27 07:49:09 UTC
README
Универсальное PHP SDK-ядро для создания API-клиентов, с расширяемой архитектурой, поддержкой авторизации, моков и валидации. Сделано для использования как основа под конкретные клиенты для работы с API.
⚙️ Установка
composer require andy87/sdk-php-client
Требования:
⚠️ Библиотека ориентирована на PHP 8.0+
- ext-curl
- ext-http
📦 Структура
Основной клиент
SdkClient.php
— базовый класс клиента, объединяющий модули, авторизацию и отправку запросов. Используется как родительский класс при реализации конкретного клиента под API партнёра.
Базовые компоненты
base/components/Config.php
— конфигурация клиентаbase/components/Account.php
— учётные данныеbase/components/Prompt.php
— описание API-запросаbase/components/Schema.php
— описание схемы ответаbase/components/MockManager.php
— мок-ответы и заглушки
Интерфейсы
AuthorizationInterface
RequestInterface
ResponseInterface
ClientInterface
MockInterface
Модули
base/modules/*
— абстрактные модули: логгер, транспорт, кэш, мок, тест
Транспорт
transports/CurlTransport.php
— базовый HTTP-клиент на базе cURL
Утилиты helpers/
ContentType.php
MethodRegistry.php
Protocol.php
Core-ядро
core/Modules.php
— менеджер модулейcore/Container.php
— DI контейнерcore/ClassRegistry.php
— подмена классовcore/transport/*
— данные связанные с запросамиQuery
,Request
,Response
,Url
🚀 Быстрый старт
Клиент
class CustomClient extends SdkClient { // Для создания клиента достаточно реализовать методы с логикой под конкретного партнёра. public function authorization( Account $account, bool $isGetFromCache = true ): bool { // Реализация авторизации } public function isTokenInvalid( Response $response ): bool { // Проверка отсутствия в ответеинформации о невалидном токене } public function reAuthorization( Account $account ): bool { // Реализация повторной авторизации если метод `isTokenInvalid` вернул true } }
Конфигурация
use andy87\sdk\client\base\interfaces\ClientInterface; use app\components\cusom\modules\CacheModule; use app\components\cusom\prompts\CustomPrompt; use app\components\cusom\mock\CustomPromptMock; class CustomConfig extends Config { // Базовые, обязательные, параметры клиента protected string $protocol = Protocol::HTTPS; // Протокол ( по умолчанию `https` ) protected string $host; // Хост API, например `api.example.com` // Расширенные, необязательные, параметры protected ?string $prefix = null; // Префикс URL, например `/api/v1` // на выхде для Prompt::$path = 'example` будет `https://api.example.com/api/v1/example`' protected array $headers = []; // Дополнительные заголовки для всех запросов // Переопределения используемых классов protected array $registryOverrides = [ ClientInterface::CACHE => CacheModule::class, // Переопределение модуля кэша ]; // Мок-ответы для тестирования ( список моков ) protected array $mockList = [ CustomPrompt::class => CustomPromptMock::class ]; // можно по необходимым условиям добавить дополнительные Mock-ответы // используя метод `updateMockList( MockInterface[] )` }
Prompt
Prompt объекты, описывают API-запросы и их параметры.
class CustomPrompt extends Prompt { // Базовые, обязательные, параметры запроса. protected string $method = Method::GET; // Метод HTTP запроса ( по умолчанию `GET` ) protected string $path = '/api/v1/resource'; // Путь к ресурсу API ( будет добавлен в конец `Config::$protocol`://`Config::$host`/`Config::$prefix`/{path} ) protected string $schema; // Схема ответа, например `CustomSchema::class` ( будет использоваться для валидации ответа и получения данных ) // Дополнительные, не обязательные параметры protected array $headers = []; // Дополнительные заголовки для запроса ( будут добавлены к `Config::$headers` ) protected ?string $contentType = СontentType::JSON; // Значение устанавливаемое в заголовок 'Content-Type' ( по умолчанию `null` ) protected ?string $mock = SomeMock::class; // Если указан класс мок-ответа, он будет использоваться вместо реального запроса ( по умолчанию `null` ) // Управление логикой public const USE_PREFIX = false; // Отключение использования префикса из конфига ( по умолчанию `true` ) public const APPLY_QUERY_TO_URL = true; // При `true` данные из query string будут добавлены в URL ( по умолчанию `false` ) public const DEBUG = true; // Статус использования дебаг режима ( по умолчанию `false` ) public const AUTH = []; // Массив классов, реализующих интерфейс `AuthorizationInterface`, которые будут применены для добавления данных авторизации. }
Схема
Схемы описывают структуру ответа API и используются для валидации данных. Схема может быть многоуровневой, и может включать в себя другие схемы.
class CustomSchema extends Schema { // Карта ассоциаций свойств с их схемами public const MAPPING = [ 'coordinates' => Coordinates::class, //Схема для поля `coordinates`, которая должна быть реализована в классе `Coordinates` 'phones' => [Phones::class], // Массив схем для поля `phones`, каждый элемент массива будет реализована как объект класса `Phones` ]; public string $id; // Поле без схемы, значение получается напрямую из ответа API public bool $required; // Поле без схемы, значение получается напрямую из ответа API /** @var array|sting[] */ public array $ids = []; // Поле без схемы, значение получается напрямую из ответа API // Свойства со схемами public Coordinates $coordinates; // Схема для поля `coordinates`, которая должна быть реализована в классе `Coordinates` /** @var array|Phones[] */ public array $phones = []; // Массив схем для поля `phones`, каждый элемент массива будет реализована как объект класса `Phones` }
🧩 Расширяемость
- Все модули, компоненты и схемы подменяемы через
ClassRegistry
или DI. - Логика транспорта, кэша, логирования и мока абстрагирована в интерфейсы и базовые классы.
✅ Тесты
Смотри tests/SdkClientTest.php
как пример.
📄 Лицензия
MIT