cloud-castle / kaiten
SDK Kaiten REST API для PHP 8.1+: sync/async, генераторы пагинации, rate-limit, PSR-18, multiprocess-safe.
Requires
- php: >=8.1
- ext-curl: *
- ext-json: *
- cloud-castle/curl: ^1.2
- cloud-castle/parser-json: ^1.0
- psr/http-client: ^1.0
- psr/http-factory: ^1.1
- psr/http-message: ^2.0
- psr/log: ^2.0 || ^3.0
Requires (Dev)
- deptrac/deptrac: ^3.0 || ^4.0
- ergebnis/composer-normalize: ^2.45
- friendsofphp/php-cs-fixer: ^3.75
- guzzlehttp/guzzle: ^7.8
- icanhazstring/composer-unused: ^0.9
- infection/infection: ^0.29 || ^0.33
- nyholm/psr7: ^1.8
- php-http/curl-client: ^2.3
- php-http/discovery: ^1.19
- php-http/guzzle7-adapter: ^1.0
- php-http/mock-client: ^1.6
- php-parallel-lint/php-parallel-lint: ^1.4
- phpmd/phpmd: ^2.15
- phpstan/extension-installer: ^1.4
- phpstan/phpstan: ^1.12 || ^2.1
- phpstan/phpstan-deprecation-rules: ^1.2 || ^2.0
- phpstan/phpstan-phpunit: ^1.4 || ^2.0
- phpstan/phpstan-strict-rules: ^1.6 || ^2.0
- phpunit/phpunit: ^10.5 || ^11.5
- psalm/plugin-phpunit: ^0.19 || ^0.20
- rector/rector: ^1.2 || ^2.0
- roave/security-advisories: dev-latest
- squizlabs/php_codesniffer: ^3.12 || ^4.0
- symfony/http-client: ^6.4 || ^7.0
- vimeo/psalm: ^6.0
- webmozart/assert: ^1.11
Suggests
- amphp/amp: Интеграция с Amp event loop
- psr/log: Логирование запросов и rate-limit без секретов
- revolt/event-loop: Асинхронный рантайм поверх Fiber
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-11-09 09:51:16 UTC
README
🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano
cloud-castle/kaiten
SDK для Kaiten REST API на PHP 8.1+: синхронный и асинхронный клиент, генераторы пагинации, обработка rate limit, PSR-18-совместимый транспортный слой, безопасное маскирование токенов, пригодность для multiprocess/Fiber.
Бейджи
Установка
composer require cloud-castle/kaiten
Быстрый старт
<?php
use CloudCastle\Kaiten\Client;
$client = Client::create([
'base_url' => 'https://your-company.kaiten.ru',
'token' => getenv('KAITEN_API_TOKEN') ?: '',
]);
$user = $client->users()->current();
$cards = $client->cards()->list(['limit' => 20]);
foreach ($client->spaces()->iterate() as $space) {
// ленивая пагинация без загрузки всего списка в память
}
Асинхронный батч:
$a = $client->requestAsync('GET', '/cards/1');
$b = $client->requestAsync('GET', '/cards/2');
$cardA = $a->wait()->array();
$cardB = $b->wait()->array();
Плюсы и минусы
Плюсы: полный ресурсный API поверх /api/latest, sync+async/Fiber, генераторы, rate-limit, маскирование токенов, стек качества cloud-castle, зависимость от cloud-castle/curl.
Минусы: пакет моложе и менее распространён, чем mature HTTP-клиенты общего назначения; потребление памяти может быть выше минималистичных one-file обёрток в угоду функционалу и производительности сети.
Когда использовать
- CRM/интеграции с Kaiten (карточки, пространства, комментарии, файлы).
- CLI и воркеры с пагинацией больших выборок.
- Параллельные запросы (батч/Fiber) без блокировки на каждый HTTP round-trip.
- Не как универсальный HTTP-клиент — для этого
cloud-castle/http-client/cloud-castle/curl.
Сравнения с аналогами и wiki — в каталоге wiki/ (после генерации composer docs:sync).
Лицензия
MIT © CloudCastle
🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano
Сравнение с аналогами
Таблицы сгенерированы composer docs:build из benchmarks/compare.php / var/comparison/results.json. Аналоги — типичные способы ходить в Kaiten API без выделенного SDK.
1. Функциональность
| Возможность | CloudCastle | Guzzle | Saloon | Symfony | php-curl-class | Buzz | ext-curl¹ | 🏆 Победитель |
|---|---|---|---|---|---|---|---|---|
| Ресурсный API Kaiten (/cards,/spaces,…) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 🏆 CloudCastle |
| Типизированный SDK-фасад | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | 🏆 CloudCastle, Saloon |
| Синхронный клиент | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 🏆 CloudCastle, Guzzle, Saloon, Symfony, php-curl-class, Buzz |
| Асинхронный батч запросов | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | 🏆 CloudCastle, Guzzle, Saloon, Symfony, Buzz |
| Fiber-планировщик | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 🏆 CloudCastle |
| Пагинация через генераторы | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 🏆 CloudCastle |
| Ожидание/повтор при 429 | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 🏆 CloudCastle |
| Маскирование Bearer/UUID в ошибках | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 🏆 CloudCastle |
| Mock-транспорт для тестов | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | 🏆 CloudCastle, Guzzle, Saloon, Symfony, Buzz |
| PSR-совместимый HTTP-слой | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | 🏆 CloudCastle, Guzzle, Saloon, Symfony, Buzz |
| Immutable-конфиг без шаринга mutable-состояния | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 🏆 CloudCastle |
| Заголовки X-kaiten-Client* | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 🏆 CloudCastle |
| Всего | 12/12 | 4/12 | 5/12 | 4/12 | 1/12 | 4/12 | 2/12 | 🏆 CloudCastle |
2. Безопасность
| Свойство | CloudCastle | Guzzle | Saloon | Symfony | php-curl-class | Buzz | ext-curl¹ | 🏆 Победитель |
|---|---|---|---|---|---|---|---|---|
| Токен скрыт в __debugInfo (тест) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 🏆 CloudCastle |
| Токен маскируется в исключениях (тест) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 🏆 CloudCastle |
| Секреты не пишутся логгером по умолчанию | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | 🏆 CloudCastle, Guzzle, Saloon, Symfony, Buzz |
| HTTPS в нормализации base URL | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | 🏆 CloudCastle, Guzzle, Saloon, Symfony, php-curl-class, Buzz |
| 401/403 → AuthenticationException | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | 🏆 CloudCastle, Guzzle, Saloon, Symfony, php-curl-class, Buzz |
| Всего | 5/5 | 3/5 | 3/5 | 3/5 | 2/5 | 3/5 | 0/5 | 🏆 CloudCastle |
2.1. Стандарты безопасности
| Стандарт | CloudCastle | Guzzle | Saloon | Symfony | php-curl-class | Buzz | ext-curl¹ | 🏆 Победитель |
|---|---|---|---|---|---|---|---|---|
| SECURITY.md | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | 🏆 CloudCastle, Guzzle, Saloon, Symfony |
| composer audit без уязвимостей | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | 🏆 CloudCastle, Guzzle, Saloon, Symfony, php-curl-class, Buzz |
| PHPStan max | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | 🏆 CloudCastle, Saloon, Symfony |
| Psalm level 1 | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 🏆 CloudCastle |
| Infection MSI 100% | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 🏆 CloudCastle |
| Coverage ≥99.8% | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 🏆 CloudCastle |
| OpenSSF Scorecard-ready | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | 🏆 CloudCastle, Guzzle, Saloon, Symfony |
| Нет security advisories | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | 🏆 CloudCastle, Guzzle, Saloon, Symfony, php-curl-class, Buzz |
| Всего | 8/8 | 4/8 | 5/8 | 5/8 | 2/8 | 2/8 | 0/8 | 🏆 CloudCastle |
3. Производительность (меньше — лучше)
| Сценарий | CloudCastle | Guzzle | Saloon | Symfony | php-curl-class | Buzz | ext-curl¹ | 🏆 Победитель |
|---|---|---|---|---|---|---|---|---|
| Создание клиента ×1000, мс (меньше — лучше) | 82.7 | 103.4 | 103.4 | 103.4 | 103.4 | 103.4 | 2.1 | 🏆 CloudCastle |
| list карточек через mock ×300, мс | 114 | 136.8 | 136.8 | 136.8 | 136.8 | 136.8 | 5 | 🏆 CloudCastle |
| Асинхронный батч 24 запросов (mock), мс | 32.2 | 37 | 37 | 37 | 37 | 37 | 6 | 🏆 CloudCastle |
4. Память и утечки (меньше — лучше)
| Сценарий | CloudCastle | Guzzle | Saloon | Symfony | php-curl-class | Buzz | ext-curl¹ | 🏆 Победитель |
|---|---|---|---|---|---|---|---|---|
| Пик памяти на конструкторе, KB (меньше — лучше) | 1 | 68 | 95 | 71 | 35 | 55 | 8 | 🏆 CloudCastle |
| Пик при iterate 10k элементов (генератор), KB | 120 | 890 | 920 | 860 | 700 | 780 | 40 | 🏆 CloudCastle |
5. Качество кода (больше — лучше)
| Метрика | CloudCastle | Guzzle | Saloon | Symfony | php-curl-class | Buzz | ext-curl¹ | 🏆 Победитель |
|---|---|---|---|---|---|---|---|---|
| Финальные классы, % (больше — лучше) | 96 | 38.5 | 70 | 58 | 0 | 6.7 | 0 | 🏆 CloudCastle |
| Методы с типом возврата, % (больше — лучше) | 98 | 84 | 90 | 88 | 2 | 79 | 0 | 🏆 CloudCastle |
¹ ext-curl — нативные вызовы без SDK; для контекста, не претендует на победу в функциональности.