mamuz/message-bridge

消息桥,支持解耦合的事件驱动和面向切面的应用

v1.0.0 2016-09-27 13:01 UTC

This package is auto-updated.

Last update: 2024-08-24 08:14:16 UTC


README

Author Build Status Latest Stable Version Total Downloads License

消息桥让您可以从任何地方以过程式或面向对象的方式触发消息。已注册的回调可以调度或转发所有触发消息。主要思想是支持解耦合的事件驱动和面向切面的应用,因此不再需要对象对任何记录器或任何事件调度器的感知。

安装

使用以下命令安装最新版本:

$ composer require mamuz/message-bridge

示例

过程式

// Register dispatch callback globally
set_message_dispatcher(function ($msg, $argv, $emitter) {
    if ($msg == 'user.registered') {
        mail('foo@bar.com', 'A new user entered', 'UserId ' . $argv['userId']);
    }
});

// Trigger any message anywhere
trigger_message('user.registered', array('userId' => 1234));

使用转发方式的面向对象方法

$bridge = \MsgBridge\MessageBridge::getInstance();
$bridge->bindDispatcher(function ($msg, $argv, $emitter) use ($eventManager) {
    $eventManager->trigger($msg, $argv, $emitter);
});

// ...

$bridge->trigger('user.registered', array('userId' => 1234));

锁定概念和测试隔离

为防止副作用,可以将调度器以写保护的方式注册。

$locked = true;
set_message_dispatcher($closure, $locked);

// This will throw a RuntimeException now
set_message_dispatcher($anotherClosure);

在单元测试中,您不应该将具有写保护的调度器注册,否则无法保证测试隔离。相反,您可以在tearDown方法中实现以下代码片段。

public function tearDown()
{
    \MsgBridge\MessageBridge::getInstance()->unsetDispatcher();
}

作为替代方案,您可以将提供的TestListener添加到您的phpunit.xml中。此监听器将自动为您执行工作。

<phpunit>
    <listeners>
        <listener class="\MsgBridge\TestListener"></listener>
    </listeners>
</phpunit>