Zend Framework 2.0事件管理器(The EventManager)入门教程

yizhihongxing

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类实现了三个处理器函数,分别为bookTicketcheckTicketleave。在bookTicket函数中,我们为EventManager注册了一个名为bookTicket的事件,并在事件处理器中输出一些信息。checkTicketleave函数的操作与之类似。

接下来,我们在另一个脚本中使用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中响应该事件。首先,我们创建两个类ModuleAModuleB,对应两个模块:

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/>';
        });
    }
}

上述代码中,ModuleAModuleB分别实现了一个名为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技术站

(0)
上一篇 2023年6月13日
下一篇 2023年6月13日

相关文章

  • Python命令行参数化的四种方式详解

    Python命令行参数化的四种方式详解 Python命令行参数化是在脚本调用时,通过命令行向脚本传递参数的一种方式。本文介绍Python命令行参数化的四种方式及其使用方法。 1. 使用sys模块 Python中的sys模块提供了一个名为argv的列表,该列表以字符串形式包含了命令行参数。通过该列表,我们可以轻松地对命令行参数进行处理。下面是一个使用sys模块…

    python 2023年6月2日
    00
  • Python内存映射文件读写方式

    当我们处理大型文件时,常常需要一种高效的方式来读取和写入文件。Python提供了内存映射文件(Memory-mapped file)来应对这种情况。 Python内存映射文件简介 内存映射文件是操作系统中的一种机制,它允许将一个文件映射到内存中的一个地址空间,从而让应用程序直接使用这块内存。内存映射文件这种形式,相当于是将磁盘上的文件映射到了内存上,这样就可…

    python 2023年6月2日
    00
  • python根据文件名批量搜索文件

    下面我会给出一个详细的 tutorial,教你如何使用 Python 根据文件名批量搜索文件。 步骤1:导入必要的模块 在开始之前我们需要导入两个非常重要的模块:os 和 fnmatch。os 库为操作系统提供了接口函数,fnmatch 则提供了 Unix shell 样式的通配符,通过这两个模块的结合能力我们可以实现在特定文件夹内根据文件名批量搜索文件。 …

    python 2023年6月5日
    00
  • python解决网站的反爬虫策略总结

    下面是Python解决网站反爬虫策略的完整攻略。 总体思路 网站反爬虫策略大多数是通过识别爬虫的特征来进行的,因此我们的应对策略就是尽可能模拟正常用户的行为,隐藏我们的爬虫特征,使得网站无法识别出我们是爬虫。具体思路如下: 伪装请求头,将爬虫请求头中的特征(如User-Agent)替换成浏览器的请求头,或者使用随机请求头。 限制爬取频率,尽量模拟人类的行为,…

    python 2023年6月3日
    00
  • Python入门教程(十二)Python列表

    Python入门教程(十二)Python列表 在Python中,列表(List)是一种常用的数据类型,它可以存储多个元素,并且这些元素可以是同一种或不同的数据类型。本文将详细讲解Python中列表的定义、访问、添加、删除、切片等操作,包括使用示例说明。 列表的定义 在Python中,列表可以通过方括号[]来定义,其中每个元素之间用逗号,隔开。例如: # 定义…

    python 2023年5月13日
    00
  • Python办公自动化从Excel中计算整理数据并写入Word

    以下是Python办公自动化从Excel中计算整理数据并写入Word的完整实例教程。 目录 准备工作 读取Excel数据 计算Excel数据 整理数据并写入Word 完整代码 准备工作 在开始编写这个自动化脚本之前,我们需要安装两个依赖库xlrd和python-docx用于处理Excel和Word文件。 pip install xlrd python-doc…

    python 2023年5月13日
    00
  • python实现监控linux性能及进程消耗性能的方法

    实现监控Linux性能及进程消耗性能的方法主要包含以下几个步骤: 第一步:安装必要软件 监控Linux性能和进程消耗性能通常需要借助于第三方工具,比如Grafana和Prometheus。可以参考以下步骤安装这两个软件(注:以下操作基于Ubuntu系统): 安装最新版Grafana: wget -q -O – https://packages.grafana…

    python 2023年6月3日
    00
  • 用python3教你任意Html主内容提取功能

    用Python3教你任意HTML主内容提取功能 在本文中,我们将介绍如何使用Python3提取HTML文档中的主要内容。我们将使用BeautifulSoup库和正则表达式来提取HTML文档中的主要内容。以下是详细的步骤和示例。 步骤1:安装BeautifulSoup库 在使用BeautifulSoup库之前,我们需要先安装它。以下是安装BeautifulSo…

    python 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部