mamuz / message-bridge
消息桥,支持解耦合的事件驱动和面向切面的应用
v1.0.0
2016-09-27 13:01 UTC
Requires
- php: ^7.0
Requires (Dev)
- phpunit/phpunit: ~5.5
README
消息桥让您可以从任何地方以过程式或面向对象的方式触发消息。已注册的回调可以调度或转发所有触发消息。主要思想是支持解耦合的事件驱动和面向切面的应用,因此不再需要对象对任何记录器或任何事件调度器的感知。
安装
使用以下命令安装最新版本:
$ 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>