Search by

Самый функциональный и быстрый PSR-14 диспетчер событий для PHP 8.1+: приоритеты, порядок before/after с топосортировкой, иерархия типов, именованные и wildcard-события, атрибуты, ленивые сервисы, отладочный и буферизующий диспетчеры, компиляция провайдера. Зависимости — только PSR.

v2.1.1 2026-09-08 10:12 UTC

This package is auto-updated.

Last update: 2026-09-08 11:07:44 UTC


README

🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano

CloudCastle Event

CloudCastle Event

Version PHP License Downloads Monthly Advisories

Repository Quality Release Issues

PHPStan Psalm PHPMD PHPCS Coverage Infection MSI OpenSSF Scorecard

Самый функциональный и быстрый PSR-14 диспетчер событий для PHP 8.1+: приоритеты, порядок before/after с топологической сортировкой, подписка по иерархии типов, именованные и wildcard-события, регистрация через атрибуты, ленивые слушатели-сервисы, интроспекция, отладочный и буферизующий диспетчеры, компиляция провайдера. Зависимости — только PSR (psr/event-dispatcher, psr/container, psr/log).

Установка

composer require cloud-castle/event

Требуется PHP 8.1+. Рекомендуемое ограничение версии: ^2.0.

Быстрый старт

<?php

use CloudCastle\Event\EventDispatcher;
use CloudCastle\Event\ListenerProvider;
use CloudCastle\Event\Priority;

final class OrderPlaced
{
    public function __construct(public readonly int $orderId)
    {
    }
}

$provider = new ListenerProvider();

// Приоритет: больше — раньше (Priority::HIGH/NORMAL/LOW или любое int).
$provider->listen(OrderPlaced::class, static function (OrderPlaced $event): void {
    // отправить уведомление по $event->orderId
}, Priority::HIGH);

// Тип события можно вывести из подсказки типа слушателя.
$provider->listenInferred(static function (OrderPlaced $event): void {
    // записать в аудит
});

// Одноразовый слушатель; снятие по возвращённому идентификатору.
$id = $provider->listenOnce(OrderPlaced::class, static fn (OrderPlaced $e) => null);
$provider->remove($id);

$dispatcher = new EventDispatcher($provider);
$event = $dispatcher->dispatch(new OrderPlaced(42));

Порядок before/after, wildcard, именованные события, ленивые сервисы и декораторы диспетчера — в документации и на wiki (страница на каждую возможность).

Возможности

Ядро

  • PSR-14 EventDispatcher + ListenerProvider — совместимость с любым потребителем.
  • Приоритеты слушателей (Priority::HIGH/NORMAL/LOW), стабильный порядок при равенстве.
  • Порядок before/after с топологической сортировкой и детекцией циклов.
  • Иерархия типов — слушатель на класс, родителя или интерфейс события.
  • Именованные/строковые события (NamedEventInterface) и wildcard (*).
  • Псевдонимы типов событий.
  • Автоопределение типа события из подсказки типа слушателя (включая union).
  • Одноразовые слушатели, снятие по id, снятие всех типа, подписчики, снятие подписчика.
  • Интроспекция: getListeners(), hasListeners(), getListenerPriority().
  • Кэш разрешения слушателей — быстрый горячий путь.

Регистрация и DI

  • Атрибуты #[Listener] + AttributeListenerRegistrar.
  • Ленивые слушатели-сервисы из PSR-11 контейнера (listenService).

Диспетчеры (декораторы)

  • Logging (PSR-3) с изоляцией ошибок слушателей (fail-safe).
  • Traceable — статистика вызванных/осиротевших событий.
  • Buffered — отложенная рассылка пачкой.
  • Composite — цепочка диспетчеров.

Провайдеры

  • Composite, Delegating (по типу), Callback (по субъекту), Immutable (read-only), Compiled (заранее разрешённые списки).

События и утилиты

  • StoppableEvent / StoppableEventTrait, GenericEvent (субъект+аргументы), трейты RecordsEvents (агрегаты) и DispatchesEvents (сервисы).

Сравнение с аналогами

Все таблицы ниже сгенерированы автоматически из честных сравнительных тестов (benchmarks/compare.php) на ОДИНАКОВОЙ операции для всех аналогов, PHP 8.3.33, без Xdebug.

1. Функциональность

Возможность🏆 CloudCastlesymfonyleaguetukioyiisoftphlymanual¹
PSR-14 совместимость (dispatch/StoppableEvent)
Приоритеты слушателей
Подписка по иерархии типов (родители/интерфейсы)
Именованные/строковые события
Wildcard-слушатели (на любое событие)
Порядок before/after + топосортировка
Регистрация через атрибуты
Ленивые слушатели-сервисы (PSR-11)
Одноразовые слушатели
Подписчики
Интроспекция (getListeners/priority)
Debug/Traceable-диспетчер
Буферизация (отложенная рассылка)
Скомпилированный провайдер
Автоопределение типа из подсказки (+union)
Всего🏆 158710350

2. Безопасность и корректность

Свойство🏆 CloudCastlesymfonyleaguetukioyiisoftphlymanual¹
Иммутабельная регистрация (нет глобального состояния)
Остановка распространения (StoppableEventInterface)
Детерминированный порядок слушателей (приоритеты)
Изоляция ошибок слушателя (не рушит остальные)
Типобезопасная маршрутизация по типу события
Всего🏆 5444340

3. Качество кода

_Прогон СОБСТВЕННЫХ инструментов проекта (PHPStan max, Psalm errorLevel 1, PHPMD, PHPCodeSniffer PSR-12, Rector, Deptrac) ЕДИНЫМ строгим конфигом по исходникам каждой библиотеки. Меньше замечаний — код строже проходит без исключений (у каждого проекта свои настройки анализа). Deptrac (архитектурные слои) и мутационное MSI (тесты не входят в дистрибутив) измеримы только для самого пакета — для аналогов «н/д»..

ПроверкаCloudCastlesymfonyleaguetukioyiisoftphly🏆 Победитель
phplint (синтаксис)000000ничья
PHPStan (level max)0229865239🏆 CloudCastle
Psalm (errorLevel 1)000000ничья
PHPMD0552814🏆 CloudCastle
PHP_CodeSniffer (PSR-12)04584500🏆 CloudCastle, yiisoft, phly
Rector (dry-run)0105939🏆 CloudCastle
Deptrac (слои)0н/дн/дн/дн/дн/д🏆 CloudCastle
Мутационное (MSI)100н/дн/дн/дн/дн/д🏆 CloudCastle
Итого замечаний🏆 033923127652🏆 CloudCastle

4. Производительность

Рассылка события одному слушателю, 1 000 000 раз (минимум из 10).

РешениеВремя (мс)🏆 Победитель
manual¹84,7базовый уровень (не библиотека)
🏆 CloudCastle197,7быстрейшее среди библиотек
symfony226,1
league475,2
phly710,4
tukio773
yiisoft1 101,1

5. Потребление памяти

Память, удерживаемая библиотекой в сценарии рассылки (изолированный процесс, дельта к baseline).

РешениеПиковая память (KB)🏆 Победитель
manual¹1базовый уровень (не библиотека)
🏆 phly14легчайшее среди библиотек
yiisoft19
league29
symfony40
CloudCastle85
tukio336

6. Утечки памяти

Рост памяти за 500 000 рассылок после прогрева (изолированный процесс; 0 — нет утечки, меньше — лучше).

РешениеУтечки памяти (байт)🏆 Победитель
🏆 CloudCastle0🏆 без утечки
🏆 symfony0🏆 без утечки
🏆 league0🏆 без утечки
🏆 tukio0🏆 без утечки
🏆 yiisoft0🏆 без утечки
🏆 phly0🏆 без утечки
manual¹0базовый уровень (не библиотека)

¹ Базовый уровень (нативные вызовы/примитивы без полноты решения) показан для контекста и не претендует на победу среди библиотек-аналогов.

Ручной массив слушателей (baseline) быстрее, но без приоритетов, иерархии типов, одноразовых слушателей, подписчиков и остановки распространения. Память измеряется в изоляции (только целевая библиотека в процессе).

Плюсы и минусы

Плюсы

  • Функционал — суперсет возможностей symfony, league, tukio и yiisoft вместе взятых, плюс wildcard-слушатели, которых нет ни у одного из них.
  • Быстрейший среди PSR-14 библиотек на горячем пути (кэш разрешения).
  • Безопасность и корректность: детерминированный порядок, изоляция ошибок слушателя, детекция циклов before/after, отсутствие глобального состояния.
  • Строгое качество: PHPStan max, Psalm errorLevel 1, PHPMD, Deptrac, Rector, PSR-12; покрытие 100% и Infection MSI 100%; матрица PHP 8.1–8.5.
  • Только PSR-зависимости (psr/event-dispatcher, psr/container, psr/log).

Минусы

  • Моложе и менее распространён, чем symfony/league — меньше звёзд и установок.
  • Потребление памяти выше, чем у минималистичных yiisoft/league: это сознательный компромисс — богатый набор возможностей загружает больше классов. Память — единственный критерий, которым мы жертвуем ради функционала, производительности и безопасности; если нужен минимальный след и только базовая рассылка — минималистичная библиотека будет легче.

Рекомендации по применению

  • Приложения и фреймворки со сложной маршрутизацией событий (приоритеты, before/after, иерархия типов, wildcard) — основной сценарий CloudCastle Event.
  • Модульные/плагинные системы — композитные и делегирующие провайдеры, подписчики и атрибуты упрощают сборку слушателей из разных источников.
  • Финтех/критичные домены — изоляция ошибок слушателей (fail-safe) и журналирование PSR-3 не дают одному сбойному обработчику ронять операцию.
  • Высоконагруженный прод — скомпилированный провайдер и кэш разрешения дают максимум скорости; отладочный диспетчер помогает в разработке.
  • Отложенные эффекты (после коммита транзакции) — буферизующий диспетчер.
  • Если нужен минимальный след памяти и только простая рассылка — рассмотрите более лёгкую библиотеку; выигрыш CloudCastle раскрывается на богатых сценариях.

Разработка

composer install
composer check    # линтеры + статический анализ + тесты
composer fix      # автоисправления (Rector, PHP CS Fixer, PHPCBF)
composer ci       # полный CI-пайплайн локально

Полный список команд с описаниями: composer run-script --list.

Документация

Лицензия

MIT © CloudCastle (alex-4-17@yandex.ru)

🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano