semperton / events
Semperton Events 组件。
1.0.0
2022-11-04 17:23 UTC
Requires
- php: >=7.4
- psr/event-dispatcher: ^1.0
Requires (Dev)
- phpunit/phpunit: ^9.5
- vimeo/psalm: ^4.7
README
Semperton Events
一个最小的、符合PSR-14的事件库。
安装
只需使用Composer
composer require semperton/events
Events 需要 PHP 7.4+
添加监听器
使用事件类或接口名称、监听器回调和可选的优先级值(默认为0,允许负值)添加监听器。监听器回调可以是任何PHP可调用对象,并且应只接受一个参数 - 事件对象。
use Semperton\Events\ListenerProvider; interface EventInterface{} final class TestEvent implements EventInterface { public $message = ''; } $provider = new ListenerProvider(); $provider->addListener(TestEvent::class, function (TestEvent $event) { $event->message .= ' World'; }); $provider->addListener(EventInterface::class, function (EventInterface $event) { $event->message = 'Hello'; }, -1); // gets called first, because of higher priority (negatives allowed)
如果您使用接口名称注册监听器,那么如果派发的事件实现了该接口,该监听器也会被触发。
移除监听器
使用 removeListener()
方法移除监听器。事件名称、监听器和优先级必须匹配。
$myListener = function (TestEvent $event) {}; $provider->addListener(TestEvent::class, $myListener, 7); $provider->removeListener(TestEvent::class, $myListener, 7); // priority must match too
派发
您只需要一个 ListenerProvider
(事件监听器集合)和一个 EventDispatcher
。
use Semperton\Events\EventDispatcher; // using the previously created ListenerProvider $dispatcher = new EventDispatcher($provider); $event = new TestEvent(); /** @var TestEvent */ $dispatchedEvent = $dispatcher->dispatch($event); $dispatchedEvent === $event; // true $dispatchedEvent->message; // 'Hello World'
DelegateListener 示例
如果您想在事件响应中调用服务方法,可以使用 callable
来解析您的服务等。为此,DelegateListener
可能很有帮助
$resolver = static function (string $class): object { return new $class(); }; $listener = new DelegateListener($resolver, Service::class, 'method');
或者使用 PSR-11 容器的 get
函数作为解析器
// $container is a Psr\Container\ContainerInterface $listener = new DelegateListener([$container, 'get'], Service::class, 'method'); $provider->addListener(TestEvent::class, $listener);