cloud-castle / listener
PSR-14 провайдер слушателей для PHP 8.1+: регистрация обработчиков атрибутом #[AsListener], автообнаружение через рефлексию и приоритеты. Дополняет любой PSR-14 диспетчер (напр. cloud-castle/event).
Requires
- php: >=8.1
- psr/event-dispatcher: ^1.0
Requires (Dev)
- 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
- 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
- vimeo/psalm: ^6.0
- webmozart/assert: ^1.11
Suggests
- cloud-castle/event: PSR-14 диспетчер событий, использующий провайдер слушателей
This package is auto-updated.
Last update: 2026-07-30 06:02:46 UTC
README
🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano
CloudCastle Listener
PSR-14 поставщик слушателей с автоопределением типа события по рефлексии: тип берётся из первого параметра слушателя, срабатывание — на подтипы, порядок — по приоритету. Пакетная регистрация методов через атрибут.
Установка
composer require cloud-castle/listener
Требуется PHP 8.1+. Единственная зависимость — psr/event-dispatcher.
Быстрый старт
<?php
use CloudCastle\Listener\Attribute\AsListener;
use CloudCastle\Listener\ReflectionListenerProvider;
$provider = new ReflectionListenerProvider();
// Тип события выводится из сигнатуры — указывать его отдельно не нужно.
$provider->listen(static function (OrderPaid $event): void {
// ...
}, priority: 10);
// Пакетная регистрация: все методы с #[AsListener].
final class OrderSubscriber
{
#[AsListener(priority: 5)]
public function onPaid(OrderPaid $event): void { /* ... */ }
}
$provider->subscribe(new OrderSubscriber());
// Совместим с любым PSR-14 диспетчером.
foreach ($provider->getListenersForEvent(new OrderPaid()) as $listener) {
$listener($event);
}
Возможности
- Автоопределение типа события —
listen()берёт тип из первого параметра слушателя через рефлексию; отдельно указывать имя события не нужно. - Срабатывание на подтипы — слушатель события-родителя (или интерфейса)
вызывается и для его наследников (проверка
instanceof). - Приоритеты — порядок вызова по убыванию приоритета (по умолчанию
0). - Регистрация через атрибут
#[AsListener]—subscribe()подключает все помеченные публичные методы объекта разом. - PSR-14 — реализует
ListenerProviderInterface, работает с любым совместимым диспетчером (например,cloud-castle/event).
Сравнение с аналогами
| Возможность | listener | symfony/event-dispatcher | league/event | yiisoft/event-dispatcher | crell/tukio | cloud-castle/event |
|---|---|---|---|---|---|---|
| PSR-14 ListenerProvider | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Автотип по рефлексии | 🏆 ✅ | ❌ | ⚠️ | ❌ | ✅ | ❌ |
| Срабатывание на подтипы | 🏆 ✅ | ⚠️ | ❌ | ❌ | ✅ | ✅ |
| Регистрация через атрибуты | ✅ | ⚠️ | ❌ | ❌ | ✅ | ❌ |
| Приоритеты | ✅ | ✅ | ✅ | ⚠️ | ✅ | ✅ |
| Runtime-зависимостей | 🏆 1 (PSR) | 2+ | 1 | 2+ | 2+ | 1 |
Когда применять. listener уместен, когда нужен PSR-14 провайдер с удобной
привязкой слушателей по типу (без строкового имени события) и атрибутами, без
привязки к фреймворку. За самим диспетчером обращайтесь к cloud-castle/event
или любому PSR-14. Если нужен полный event-стек с подписчиками и остановкой
распространения из коробки — берите symfony/event-dispatcher или crell/tukio.
Разработка
composer install
composer check # линтеры + статический анализ + тесты
composer fix # автоисправления (Rector, PHP CS Fixer, PHPCBF)
composer ci # полный CI-пайплайн локально
Полный список команд с описаниями: composer run-script --list.
Документация
- Репозиторий: https://gitverse.ru/cloud-castle/listener
- История изменений: CHANGELOG.md
- Как внести вклад: CONTRIBUTING.md
- Кодекс поведения: CODE_OF_CONDUCT.md
- Политика безопасности: SECURITY.md
Лицензия
MIT © CloudCastle (alex-4-17@yandex.ru)
🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano