kelvinmo/f3-event-dispatcher

适用于 Fat-Free 框架的 PSR-14 兼容事件分发器

v0.1.4 2023-07-22 03:32 UTC

This package is auto-updated.

Last update: 2024-08-30 04:56:21 UTC


README

这是一个简单的 PSR-14 兼容事件分发器和监听器提供程序库,适用于 Fat-Free 框架

Latest Stable Version build

要求

  • 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() 方法使用反射添加监听器。此方法接受一个名称或一个类的实例化对象。如果该类具有以下方法,则将添加监听器:

  1. 它是 public 方法(是否也是 static 无关)
  2. 方法名称以 on 开头
  3. 方法恰好接受一个参数,并且该参数通过事件类进行了类型提示。

方法将监听的事件名称取决于方法名称。如果方法名称与方法参数类型简写的名称相同,则事件名称为参数类型的完全限定名称。否则,事件名称为将方法名称转换为蛇形命名的名称,在这种情况下,事件类型必须是泛型事件(即实现 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 或更高版本