splot/event-manager

事件管理器。

1.0.1 2020-03-05 17:45 UTC

This package is auto-updated.

Last update: 2024-09-06 03:26:32 UTC


README

PHP的简单事件管理器。

Build Status SensioLabsInsight HHVM Status

特性

  • 停止事件进一步传播/停止调用其他监听器。
  • 在事件中标记默认操作应该被阻止。
  • 所有事件都是类和对象。

安装

您可以使用 Composer 安装 Splot 事件管理器。

$ composer require splot/event-manager dev-master

要开始使用它,只需实例化即可。

$eventManager = new \Splot\EventManager\EventManager();

您可以可选地传递一个 Psr\Log\LoggerInterface 到构造函数以用于调试信息。

事件

在 Splot 事件管理器中,每个事件都是扩展 Splot\EventManager\AbstractEvent 的类的实例。这意味着每个事件名称都是在该事件类中设置的(默认情况下,事件名称是其完整命名空间类名),实际的事件对象传递给所有监听器。它们可能包含也可能不包含任何附加数据,它完全由触发事件的代码负责用数据填充。

如果您想使用一个事件名称(例如,注册一个监听器),最佳实践是从事件类的静态方法 ::getName() 获取它。

按照惯例,所有事件应该是只读的,因此最佳做法是在它们的构造函数中传递任何数据,并不允许在以后的时间对其进行更改(例如,通过将它们存储在 protectedprivate 属性中,并不要为它们创建设置器)。

触发事件

要触发一个事件,您只需调用带有事件实例的 EventManager::trigger() 方法。

$eventManager->trigger(new MyEvent());

此方法返回 boolean 以方便检查随事件之后执行的默认操作是否应该执行。请参见下文以获取详细信息。

监听事件

要监听一个事件,您可以订阅一个 callable(通常是闭包)。然后,监听器将使用单个参数调用 - 事件实例。

$eventManager->subscribe(MyEvent::getName(), function($event) {
    // do something
});

监听器优先级

监听器按它们注册的顺序调用,但您可以为监听器订阅优先级(优先级越高,则首先执行)。默认情况下,优先级是 0,但它可以是正数或负数。

只需将监听器优先级作为 ::subscribe() 方法的第三个(最后一个)参数传递即可。

$eventManager->subscribe(MyEvent::getName(), function($event) {
    // listener one
}, -20);

$eventManager->subscribe(MyEvent::getName(), function($event) {
    // listener two
}, 30);

在上面的示例中,当触发 MyEvent 时,第二个监听器将首先执行。

其他

停止传播

当监听事件时,您还可以防止调用后续的监听器。

$event->stopPropagation()

调用此方法将让事件管理器知道不应通知关于 $event 的其他监听器。

防止默认操作

事件可以通知触发代码,随事件之后执行的默认操作不应执行。这很简单,只需调用

$event->preventDefault()

或从监听器返回 false

触发代码可以检查事件实例

$eventManager->trigger($event);
if (!$event->isDefaultPrevented()) {
    // do something that is suppose to happen
}

为了方便起见,EventManager::trigger() 方法还返回有关是否防止默认操作的信息(如果没有防止默认操作,它返回 true)。上面的示例可以写成这样

if ($eventManager->trigger($event)) {
    // do something that is suppose to happen
}

贡献

欢迎提交问题和拉取请求!在创建拉取请求时,请包括您的更改的完整测试覆盖率。