kelvinmo / f3-event-dispatcher
适用于 Fat-Free 框架的 PSR-14 兼容事件分发器
Requires
- php: ^7.2 || ^8.0
- bcosca/fatfree-core: ^3.5
- psr/event-dispatcher: ^1.0
Requires (Dev)
- phpstan/phpstan: ^1.3
- phpunit/phpunit: ^8.0 || ^9.3
Provides
README
这是一个简单的 PSR-14 兼容事件分发器和监听器提供程序库,适用于 Fat-Free 框架。
要求
- PHP 7.2 或更高版本
- Fat-Free 框架 3.5 或更高版本
安装
您可以通过 Composer 安装。
composer require kelvinmo/f3-event-dispatcher
使用方法
监听器提供程序
监听器提供程序由 \Listeners
类实现。 Listeners
是 Fat-Free 的 \Prefab
类的子类。
$listeners = \Listeners::instance();
要添加监听器,请调用 on()
方法。事件名称指定为第一个参数,监听器指定为第二个参数。
根据 PSR-14 的要求,如果事件名称是类的名称,则将对该事件类的所有子类触发监听器。
监听器可以是 PHP 可调用,或者可以被 Fat-Free 的 call()
方法解析的字符串。
// Object method $listeners->on(FooEvent::class, 'Bar->listener'); // Static method $listeners->on(FooEvent::class, 'Bar::listener'); // PHP callable $listeners->on(FooEvent::class, [ $object, 'listener' ]); // Closure $listeners->on(FooEvent::class, function($event) { // listener });
on()
方法还接受第三个可选参数,指定监听器应调用的优先级。从最高优先级到最低优先级调用监听器。
// Baz->listener is called first, then Bar->listener $listeners->on(FooEvent::class, 'Bar->listener', 10); $listeners->on(FooEvent::class, 'Baz->listener', 20);
您可以使用 Listeners
与任何 PSR-14 兼容的事件分发器。
泛型事件
有时为每个单独的事件创建一个新的事件类过于繁琐。您可以使用 泛型事件 将一组相关事件组合成一个类。
泛型事件实现 GenericEventInterface
并通过 getEventName()
方法提供事件名称。
class BarEvent implements GenericEventInterface { private $eventName; public function __construct($eventName) { $this->eventName = $eventName; } public function getEventName() { return $this->eventName; } } $listeners->on('foo', 'Baz->listener'); $event = new BarEvent('foo');
通过反射添加监听器
您还可以通过 map()
方法使用反射添加监听器。此方法接受一个名称或一个类的实例化对象。如果该类具有以下方法,则将添加监听器:
- 它是
public
方法(是否也是static
无关) - 方法名称以
on
开头 - 方法恰好接受一个参数,并且该参数通过事件类进行了类型提示。
方法将监听的事件名称取决于方法名称。如果方法名称与方法参数类型简写的名称相同,则事件名称为参数类型的完全限定名称。否则,事件名称为将方法名称转换为蛇形命名的名称,在这种情况下,事件类型必须是泛型事件(即实现 GenericEventInterface
)。
class TestListener { // Will be mapped to FooEvent (with namespace) public function onFooEvent(FooEvent $event) { } // Will be mapped to custom_event // (BarEvent must implement GenericEventInterface) public function onCustomEvent(BarEvent $event) { } } $listeners = \Listeners::instance(); $listeners->map(TestListener::class);
事件分发器
事件分发器由 \Events
类实现。 Events
是 Fat-Free 的 \Prefab
类的子类。
$dispatcher = \Events::instance();
默认情况下,Events
使用此库中包含的 Listeners
监听器提供程序。要使用不同的监听器提供程序,请将提供程序作为参数传递给构造函数。
use League\Event\PrioritizedListenerRegistry; $listenerProvider = new PrioritizedListenerRegistry(); $dispatcher = \Events::instance($listenerProvider);
要使用事件分发器,请调用标准的 PSR-14 dispatch()
方法。
$dispatcher->dispatch(new FooEvent());
许可证
GPL 3 或更高版本