splot / event-manager
事件管理器。
Requires
- php: >=5.3.3
- michaldudek/foundation: >=0.9
- psr/log: >=1.0,<2.0
This package is auto-updated.
Last update: 2024-09-06 03:26:32 UTC
README
PHP的简单事件管理器。
特性
- 停止事件进一步传播/停止调用其他监听器。
- 在事件中标记默认操作应该被阻止。
- 所有事件都是类和对象。
安装
您可以使用 Composer 安装 Splot 事件管理器。
$ composer require splot/event-manager dev-master
要开始使用它,只需实例化即可。
$eventManager = new \Splot\EventManager\EventManager();
您可以可选地传递一个 Psr\Log\LoggerInterface
到构造函数以用于调试信息。
事件
在 Splot 事件管理器中,每个事件都是扩展 Splot\EventManager\AbstractEvent
的类的实例。这意味着每个事件名称都是在该事件类中设置的(默认情况下,事件名称是其完整命名空间类名),实际的事件对象传递给所有监听器。它们可能包含也可能不包含任何附加数据,它完全由触发事件的代码负责用数据填充。
如果您想使用一个事件名称(例如,注册一个监听器),最佳实践是从事件类的静态方法 ::getName()
获取它。
按照惯例,所有事件应该是只读的,因此最佳做法是在它们的构造函数中传递任何数据,并不允许在以后的时间对其进行更改(例如,通过将它们存储在 protected
或 private
属性中,并不要为它们创建设置器)。
触发事件
要触发一个事件,您只需调用带有事件实例的 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
}
贡献
欢迎提交问题和拉取请求!在创建拉取请求时,请包括您的更改的完整测试覆盖率。