gigi / event-request-response

允许发布消息并从每个订阅者获取响应

1.0.1 2016-02-17 09:48 UTC

This package is not auto-updated.

Last update: 2024-09-14 18:47:39 UTC


README

小型订阅者/发布者消息系统。

该包实现了单向消息交换模式和请求-回复消息交换模式。

需求

此库包需要 PHP 5.4 或更高版本。

安装

$ composer require gigi/event-request-response

使用

创建消息传递实例(单例)

use gigi\events\classes\Messenger;

$handler = Messenger::getInstance();

订阅消息

$handler->subscribe('message.test', function ($message) {
    // do something with message
    // stops further message processing
    $message->setIsHandled(true);

    // optionally return mixed response
    // Will be accessible in reply object (Message::getData())
    return 'Data to return';
});

创建消息

use gigi\events\classes\Message;

$message = new Message('message.test', 'Mixed data to send');

使用三种方法之一发布 $message

// one-way notifier
$handler->request($message);
// request-response notifier
// Returns array of Messages
$result = $handler->requestReply($message);
// request-response notifier
// Returns only first reply (Message object)
// Use if Your don't care of who can return an answer
// for example if you want to get list of all users ('users.get.all')
// or you know for sure that only one subscriber listening

$result = $handler->requestFirstReply($message);

有关详细使用说明,请参阅 examples/singleton.php

如果单例让您感到痛苦或您的项目有自己的依赖注入容器,则将 gigi\classes\MessageHandler 注入到 gigi\classes\Publishergigi\classes\Subscriber 的新实例中。请参阅 examples/di.php

与 Yii2 框架一起使用

将发布者和订阅者组件添加到配置(config/web.php)

return [
    ...
    'components' => [
        ...
        'subscriber' => 'gigi\events\classes\Subscriber',
        'publisher'  => 'gigi\events\classes\Publisher',
        ...

gigi\events\classes\MessageHandlerInterface 添加到 DI 容器中。有关 Yii2 DI 容器的更多信息,请参阅 https://yiiframework.cn/doc-2.0/guide-concept-di-container.html

\Yii::$container->setSingleton(
    'gigi\events\interfaces\MessageHandlerInterface',
    'gigi\events\classes\MessageHandler'
);

订阅事件

\Yii::$app->get('subscriber')->subscribe($event, $handler);

发布

...
use gigi\events\classes\Message;
...

/** @var \gigi\events\interfaces\MessageInterface $message */
$message = new Message($messageName, $data);

// async
\Yii::$app->get('publisher')->request($message);

// all replies
\Yii::$app->get('publisher')->requestReply($message);

// first reply
\Yii::$app->get('publisher')->requestFirstReply($message);

或实现您自己的类以实现接口...

享受 :)