Универсальное 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— мок-ответы и заглушки
AuthorizationInterfaceRequestInterfaceResponseInterfaceClientInterfaceMockInterface
base/modules/*— абстрактные модули: логгер, транспорт, кэш, мок, тест
transports/CurlTransport.php— базовый HTTP-клиент на базе cURL
ContentType.phpMethodRegistry.phpProtocol.php
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 объекты, описывают 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