semperton/events

Semperton Events 组件。

1.0.0 2022-11-04 17:23 UTC

This package is auto-updated.

Last update: 2024-09-04 21:15:13 UTC


README

Semperton

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);