soliphp / events
事件管理器
Requires
- php: >=5.5.0
Provides
This package is auto-updated.
Last update: 2024-09-05 04:25:19 UTC
README
事件管理器,用于管理事件的注册、删除和调度(触发)。
安装
使用 composer
在你的项目中安装:
composer require soliphp/events
使用
针对特定事件设置监听器
use Soli\Events\EventManager;
use Soli\Events\Event;
$eventManager = new EventManager();
$eventManager->attach('app.boot', function (Event $event, $app) {
echo "应用已启动\n";
});
监听器的格式
,可以是 匿名函数或对象实例
。
例如,我们在这里定义一个 AppEvents
类来处理针对 App
类的事件:
class AppEvents
{
public function boot(Event $event, $app)
{
// 导出内部(事件)数据或状态给外部(监听器)调用者
$data = $event->getData();
echo "应用已启动\n";
}
public function finish(Event $event, $app, $data)
{
echo "应用执行结束\n";
}
}
// 注册事件监听
// 匿名函数
$eventManager->attach('app.boot', function (Event $event, $app) {
$ver = $app::VERSION;
echo "应用已启动 $ver\n";
});
// 对象实例
$eventManager->attach('app.boot', new AppEvents);
将事件监听器聚合到专门的事件类中进行处理
我们上面定义了 AppEvents
类,其中包含两个方法 boot
和 finish
,这两个方法可以直接用来监听 app.boot
事件和 app.finish
事件,注册方法很简单,如下:
$eventManager->attach('app', new AppEvents);
这样我们就可以方便地注册和整理不同维度的事件。
触发事件
触发事件通过调用 trigger
方法,参数为具体的事件名称,事件源(当前类),也可以传入更多整合后的数据,供监听器使用。
$eventManager->trigger('app.boot', $this, $data);
事件传播
$eventManager->attach('app.boot', function (Event $event, $app) {
// 终止事件传播,这样其他的侦听器就不会再收到此事件通知
$event->stopPropagation();
});
PSR-14
soliphp/events
实现了大部分的 PSR-14 接口,但与 PSR-14 也有一些不同。
- EventManagerInterface 的 clearListeners 接口已实现,但未写入 EventManagerInterface 接口文件。
对比 clearListeners 的命名格式,添加和移除监听器的命名应为 addListener、removeListener,而不应为 attach、detach。但实际上我们更习惯使用 attach、detach 的命名,因此搁置了 clearListeners 方法,暂时不写入 EventManagerInterface 接口文件。等待 PSR-14 正式通过后,再进行调整。
- EventManagerInterface 的 trigger 接口实现
PSR-14 上的 trigger 接口方法为:
/**
* Trigger an event
*
* Can accept an EventInterface or will create one if not passed
*
* @param string|EventInterface $event
* @param object|string $target
* @param array|object $argv
* @return mixed
*/
public function trigger($event, $target = null, $argv = array());
第三个参数 $argv 类型为 array|object,实际上这个参数类型可以更广泛,如 string/int 等。
因此,这里将 $argv 参数类型改为 mixed,默认值改为 null,并命名为 $data:
/**
* @param mixed $data
*/
public function trigger($event, $target = null, $data = null);
- EventInterface 使用 get/setData 替换 get/setParams、getParam
第2点提到 $data(即 $argv)的参数类型为 mixed,因此我们直接使用 get/setData 替换它;
且如果第2点不更改 $argv 参数类型,get/setParams、getParam 三个接口并不能直接体现 $argv 为 object 时的情况。在 object 时选择 getParam() 还是 getParams() 获取 $argv 参数,会让开发者困惑:array 时使用 getParams(),而 object 时使用 getParam()。实际上,getParam() 只是在 $argv 参数类型为 array 时获取单个元素,那么 object 时如何获取?这样的接口体验远不如直接使用 getData() 一个方法,让开发者处理具体的数据类型问题。
测试
$ cd /path/to/soliphp/events/
$ composer install
$ phpunit
许可
MIT 公共许可证