Zend Framework 2.0事件管理器入门教程
什么是Zend Framework的事件管理器?
Zend Framework的事件管理器提供了一种松耦合架构的方式,它通过一个可扩展的事件机制,让系统中的各个组件/模块之间更方便的互相通信和协作,使得系统更具伸缩性和可拓展性。通过Zend Framework的事件管理器,你可以把代码组织好,使得不同的代码之间可以更好地配合完成自己的任务。
怎样使用Zend Framework的事件管理器?
Zend Framework的事件管理器由三个主要的类组成:
- EventManager - 事件管理器本身,用于注册事件,附加和分离事件处理器,触发事件等;
- Event - 事件的一个实例类,保存事件的名称和此事件具体的数据信息;
- EventInterface - 定义事件接口的方法。
1. 注册事件处理器
使用EventManager类的attach()方法注册事件处理器。这个方法接收两个参数,第一个参数是事件的名称,第二个参数是事件处理器回调函数。这里我们可以使用具体的对象(对象必须实现__invoke()
方法)或者直接使用函数名称。下面是一个注册事件处理器的例子:
use Zend\EventManager\EventManager;
$eventManager = new EventManager();
$eventManager->attach('my-event', function ($event) {
echo "Hello, world";
});
上述代码在EventManager实例中注册了一个名为'my-event'的事件,并且附加了一个简单的匿名函数作为事件处理器。
2. 触发事件处理器
使用EventManager类的trigger()方法触发事件处理器。这个方法接收两个参数,第一个参数是事件的名称;第二个参数通过数据实例化一个事件对象,可以通过后续调用此方法传递给事件处理器。下面是一个触发事件处理器的例子:
$event = new Event();
$event->setName('my-event');
$eventManager->trigger($event);
通过这些操作,事件处理器就被触发。
示例说明
下面我们将演示如何使用Zend Framework的事件管理器。
示例1
首先,我们创建一个名为TestEventManager.php
的类,在类中注册监听事件并编写相应的处理器函数:
use Zend\EventManager\EventManagerInterface;
class TestEventManager
{
/**
* 旅客购票
*/
public function bookTicket(EventManagerInterface $eventManager)
{
$eventManager->addIdentifiers([
__CLASS__,
'bookTicket'
]);
echo '欢迎购票!<br/>';
$worker = $this;
$eventManager->attach('bookTicket', function($event) use ($worker) {
echo "已于" . date('H:i:s', time()) . "为{$event->params['name']}购买了{$event->params['ticket']}张票<br/>";
});
}
/**
* 车票核销
*/
public function checkTicket(EventManagerInterface $eventManager)
{
$eventManager->addIdentifiers([
__CLASS__,
'checkTicket'
]);
echo '欢迎乘坐!<br/>';
$eventManager->attach('checkTicket', function($event) {
echo "现在" . date('H:i:s', time()) . ",检票口{$event->params['check']}正在为{$event->params['name']}检票<br/>";
});
}
/**
* 旅客离开
*/
public function leave(EventManagerInterface $eventManager)
{
$eventManager->addIdentifiers([
__CLASS__,
'leave'
]);
echo '感谢您的乘坐,再见!<br/>';
$eventManager->attach('leave', function($event) {
echo "现在" . date('H:i:s', time()) . ",{$event->params['name']}已经下车离开了本站<br/>";
});
}
}
TestEventManager
类实现了三个处理器函数,分别为bookTicket
、checkTicket
和leave
。在bookTicket
函数中,我们为EventManager注册了一个名为bookTicket
的事件,并在事件处理器中输出一些信息。checkTicket
和leave
函数的操作与之类似。
接下来,我们在另一个脚本中使用EventManager来触发上述事件,示例代码如下:
use Zend\EventManager\EventManager;
use Zend\EventManager\Event;
// 实例化EventManager
$eventManager = new EventManager();
// 实例化TestEventManager类
$testEventManager = new TestEventManager();
// 注册监听事件
$testEventManager->bookTicket($eventManager);
$testEventManager->checkTicket($eventManager);
$testEventManager->leave($eventManager);
// 触发事件
$event = new Event('bookTicket', null, ['name' => '张三', 'ticket' => 2]);
$eventManager->trigger($event);
$event = new Event('checkTicket', null, ['name' => '张三', 'check' => 'A1']);
$eventManager->trigger($event);
$event = new Event('leave', null, ['name' => '张三']);
$eventManager->trigger($event);
运行上述代码,我们会看到以下输出结果:
欢迎购票!
已于14:05:21为张三购买了2张票
欢迎乘坐!
现在14:05:21,检票口A1正在为张三检票
感谢您的乘坐,再见!
现在14:05:21,张三已经下车离开了本站
从输出结果中可以看出,我们添加的事件处理器被成功执行了。
示例2:
再来一个稍微复杂一些的示例,假设我们要实现有两个模块A和B,在模块A中触发一个事件,模块B中响应该事件。首先,我们创建两个类ModuleA
和ModuleB
,对应两个模块:
use Zend\EventManager\EventManagerInterface;
class ModuleA
{
public function __construct(EventManagerInterface $eventManager)
{
$eventManager->addIdentifier('ModuleA');
$eventManager->attach('testEvent', function ($e) {
echo 'This is module A listening to test event.<br/>';
});
}
public function triggerEvent(EventManagerInterface $eventManager)
{
$event = new Event('testEvent', $this);
$eventManager->trigger($event);
}
}
class ModuleB
{
public function __construct(EventManagerInterface $eventManager)
{
$eventManager->addIdentifier('ModuleB');
$eventManager->attach('testEvent', function ($e) {
echo 'This is module B listening to test event.<br/>';
});
}
}
上述代码中,ModuleA
和ModuleB
分别实现了一个名为testEvent
的事件处理器(虽然是两个独立的处理器,但是它们都监听了同一个事件)。然后,在ModuleA
中定义了一个triggerEvent()
方法,在此方法中,我们实例化了一个Event类,其中包含了事件名和触发事件的实体类对象,然后通过EventManager的trigger()方法触发此事件。
在另外一个脚本中,我们实例化两个类,使用EventManager让它们联系在一起:
use Zend\EventManager\EventManager;
// 初始化EventManager
$eventManager = new EventManager();
// 实例化ModuleA和ModuleB
$moduleA = new ModuleA($eventManager);
$moduleB = new ModuleB($eventManager);
// 触发testEvent事件
$moduleA->triggerEvent($eventManager);
这样,我们就完成了一个典型的事件管理器的例子。
总结
通过上述示例,我们可以看到,Zend Framework的事件管理器可以实现模块之间的松耦合。当模块A触发了事件,所有监听该事件的模块B都能够响应,而不用担心模块A和B之间的逻辑关系。该机制让我们的代码更具扩展性和可维护性,并且允许你轻松地添加新的功能或更改现有逻辑。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Zend Framework 2.0事件管理器(The EventManager)入门教程 - Python技术站