phpway/pubsubwp

一个简单的发布-订阅库,支持为订阅者指定优先级

1.0 2017-11-16 21:48 UTC

This package is not auto-updated.

Last update: 2024-09-29 04:25:59 UTC


README

Build Status

我听到你了 - 为什么还需要另一个pubsub库,现在已经有这么多?我在寻找一个简单的PHP发布-订阅实现,具有以下特性

  • 简单易用
  • 可以为订阅者设置可选的优先级;当发布主题时,具有更高优先级的订阅者将被首先调用
  • 订阅者可以在发布主题时停止调用队列中的后续回调

这个简单的pubsub库试图填补这一空白。

使用示例

创建pubsub实例

$pubsub = new \PubSubWP\PubSub;

订阅一些回调到某个主题

$pubsub->subscribe('topic.foo', function ($event) { $event['tape'] .= 'a'; });
$pubsub->subscribe('topic.foo', function ($event) { $event['tape'] .= 'b'; });

您也可以为回调订阅优先级。当主题发布时,回调会根据此优先级排序后再被调用(优先级更高的回调将首先执行)。默认优先级为0。

$priority = 10;
$pubsub->subscribe('topic.foo', function ($event) { $event['tape'] .= 'A'; }, $priority);

当通过 PubSub::publish() 方法发布主题时,pubsub将创建一个事件对象(继承自 ArrayObject),然后按优先级顺序开始传递给所有订阅的回调

$initialEventData = ['tape' => ''];
$event = $pubsub->publish('topic.foo', $initialEventData);

事件的基本数据可以指定在第二个可选参数中。每个订阅的回调将接收此事件对象作为(唯一的)参数。

print $event['tape'];   // 'Aab'

具有更高优先级的回调“在磁带上写入'A'”首先执行。

回调还可以决定跳过队列中尚未执行的所有其他回调。这可以通过调用 Event::stop() 方法来完成

$pubsub->subscribe(
    'topic.foo',
    function ($event) {
        $event['tape'] .= '[STOP]';
        $event->stop();
    },
    5
);

这将导致跳过所有优先级低于5的回调

$event = $pubsub->publish('topic.foo', ['tape' => '']);
print $event['tape'];   // 'A[STOP]'

您还可以指定自己的将通过订阅的回调传递的事件。唯一的要求是它必须继承自 PubSubWP\Event,这是默认事件的类

$myEvent = new MyEvent;
$event = $pubsub->publish('topic.foo', $myEvent);