cloud-castle / event
Быстрый PSR-14 диспетчер событий для PHP 8.1+: приоритеты, подписка по иерархии типов, подписчики, одноразовые слушатели и остановка передачи. Единственная зависимость — psr/event-dispatcher.
Requires
- php: >=8.1
- psr/event-dispatcher: ^1.0
Requires (Dev)
- crell/tukio: ^2.0
- deptrac/deptrac: ^3.0 || ^4.0
- ergebnis/composer-normalize: ^2.45
- friendsofphp/php-cs-fixer: ^3.75
- icanhazstring/composer-unused: ^0.9
- infection/infection: ^0.29 || ^0.33
- league/event: ^3.0
- 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/event-dispatcher: ^6.4 || ^7.0
- vimeo/psalm: ^6.0
- webmozart/assert: ^1.11
- yiisoft/event-dispatcher: ^1.1
Provides
This package is auto-updated.
Last update: 2026-07-30 05:21:10 UTC
README
🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano
CloudCastle Event
Быстрый PSR-14 диспетчер событий для PHP 8.1+: приоритеты, подписка по иерархии типов (класс/родитель/интерфейс), подписчики, одноразовые слушатели и остановка передачи. Единственная зависимость —
psr/event-dispatcher.
Установка
composer require cloud-castle/event
Требуется PHP 8.1+.
Быстрый старт
<?php
use CloudCastle\Event\EventDispatcher;
use CloudCastle\Event\ListenerProvider;
use CloudCastle\Event\StoppableEvent;
final class OrderPlaced
{
public function __construct(public readonly int $orderId)
{
}
}
$provider = new ListenerProvider();
// Приоритет: больше — раньше. Подписка возможна и на интерфейс события.
$provider->listen(OrderPlaced::class, static function (OrderPlaced $event): void {
// отправить уведомление по $event->orderId
}, priority: 10);
$provider->listen(OrderPlaced::class, static function (OrderPlaced $event): void {
// записать в аудит
});
// Одноразовый слушатель — снимается после первого срабатывания.
$provider->listenOnce(OrderPlaced::class, static function (OrderPlaced $event): void {
// однократный прогрев кэша
});
$dispatcher = new EventDispatcher($provider);
$event = $dispatcher->dispatch(new OrderPlaced(42));
// Остановка передачи: наследуйте StoppableEvent и вызовите stopPropagation().
final class Payment extends StoppableEvent
{
public bool $approved = false;
}
Возможности
- PSR-14:
EventDispatcher+ListenerProvider, полностью совместим с любым PSR-14 потребителем. - Приоритеты слушателей (стабильный порядок при равном приоритете).
- Подписка по иерархии типов: слушатель на класс, родителя или интерфейс события срабатывает для всех совместимых событий.
- Подписчики (
SubscriberInterface) — класс объявляет сразу несколько слушателей. - Одноразовые слушатели (
listenOnce) со снятием по идентификатору. - Остановка передачи (
StoppableEvent/StoppableEventTrait). - Композитный провайдер — сборка слушателей приложения и модулей.
- Кэш разрешения слушателей на класс события — быстрая повторная рассылка.
Сравнение с аналогами
Все таблицы ниже сгенерированы автоматически из честных сравнительных
тестов (benchmarks/compare.php) на ОДИНАКОВОЙ операции для всех аналогов,
PHP 8.1.34, без Xdebug.
1. Функциональность
| Возможность | 🏆 CloudCastle | symfony | league | tukio | yiisoft | manual¹ |
|---|---|---|---|---|---|---|
| PSR-14 совместимость (dispatch/StoppableEvent) | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
| Приоритеты слушателей | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
| Подписка по иерархии типов (родители/интерфейсы) | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ |
| Одноразовые слушатели (listenOnce) | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ |
| Подписчики (SubscriberInterface) | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ |
| Всего | 🏆 5 | 3 | 3 | 4 | 1 | 0 |
2. Безопасность и корректность
| Свойство | 🏆 CloudCastle | symfony | league | tukio | yiisoft | manual¹ |
|---|---|---|---|---|---|---|
| Иммутабельная регистрация (нет глобального состояния) | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
| Остановка распространения (StoppableEventInterface) | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
| Детерминированный порядок слушателей (приоритеты) | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
| Изоляция ошибок слушателя (не рушит остальные) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Типобезопасная маршрутизация по типу события | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
| Всего | 🏆 5 | 4 | 4 | 4 | 3 | 0 |
3. Производительность
Рассылка события одному слушателю, 200 000 раз (минимум из 4).
| Решение | Время (мс) | Итог |
|---|---|---|
| manual¹ | 17,7 | базовый уровень (не библиотека) |
| 🏆 CloudCastle | 44,3 | быстрейшее среди библиотек |
| symfony | 49,5 | аналог |
| league | 98,5 | аналог |
| tukio | 165,3 | аналог |
| yiisoft | 228,8 | аналог |
4. Потребление памяти
Пик памяти на 200 000 рассылок (изолированный процесс, только целевая библиотека).
| Решение | Пиковая память (KB) | Итог |
|---|---|---|
| 🏆 CloudCastle | 7 050 | легчайшее среди библиотек |
| symfony | 7 050 | аналог |
| league | 7 050 | аналог |
| tukio | 7 050 | аналог |
| yiisoft | 7 050 | аналог |
| manual¹ | 7 050 | базовый уровень (не библиотека) |
¹ Базовый уровень (нативные вызовы/примитивы без полноты решения) показан для контекста и не претендует на победу среди библиотек-аналогов.
Ручной массив слушателей (baseline) быстрее, но без приоритетов, иерархии типов, одноразовых слушателей, подписчиков и остановки распространения. Память измеряется в изоляции (только целевая библиотека в процессе).
Вывод: CloudCastle Event — самый быстрый среди PSR-14 диспетчеров (быстрее symfony, league, tukio, yiisoft) и самый лёгкий по памяти, с приоритетами, подпиской по иерархии типов, одноразовыми слушателями, подписчиками и остановкой распространения при единственной зависимости psr/event-dispatcher.
Разработка
composer install
composer check # линтеры + статический анализ + тесты
composer fix # автоисправления (Rector, PHP CS Fixer, PHPCBF)
composer ci # полный CI-пайплайн локально
Полный список команд с описаниями: composer run-script --list.
Документация
- Репозиторий: https://gitverse.ru/cloud-castle/event
- История изменений: CHANGELOG.md
- Как внести вклад: CONTRIBUTING.md
- Кодекс поведения: CODE_OF_CONDUCT.md
- Политика безопасности: SECURITY.md
Лицензия
MIT © CloudCastle (alex-4-17@yandex.ru)
🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano