- Zend Framework 教程
- Zend Framework - 首页
- Zend Framework - 简介
- Zend Framework - 安装
- 框架应用
- Zend Framework - MVC 架构
- Zend Framework - 概念
- Zend Framework - 服务管理器
- Zend Framework - 事件管理器
- Zend Framework - 模块系统
- 应用程序结构
- Zend Framework - 创建模块
- Zend Framework - 控制器
- Zend Framework - 路由
- Zend Framework - 视图层
- Zend Framework - 布局
- 模型与数据库
- 不同的数据库
- 表单与验证
- Zend Framework - 文件上传
- Zend Framework - Ajax
- Cookie 管理
- 会话管理
- Zend Framework - 身份验证
- 邮件管理
- Zend Framework - 单元测试
- Zend Framework - 错误处理
- Zend Framework - 工作示例
- Zend Framework 有用资源
- Zend Framework - 快速指南
- Zend Framework - 有用资源
- Zend Framework - 讨论
Zend Framework - 事件管理器
所有现代应用程序都需要强大且灵活的事件组件。Zend Framework 提供了一个这样的组件,zend-eventmanager。zend-eventmanager 有助于设计高级架构,并支持发布/订阅模式和面向方面的编程。
安装事件管理器
事件管理器可以使用Composer安装,如下所示:
composer require zendframework/zend-eventmanager
事件管理器的概念
事件管理器的核心概念如下:
事件 - 事件是任意命名的动作,例如greet。
监听器 - 任何 PHP 回调函数。它们附加到事件,并在事件触发时被调用。监听器的默认签名为:
function(EventInterface $e)
EventInterface 类 - 用于指定事件本身。它具有设置和获取事件信息的方法,例如名称 (set/getName)、目标 (get/setTarget) 和参数 (get/setParams)。
EventManager 类 - EventManager 的实例跟踪应用程序中所有定义的事件及其相应的监听器。EventManager 提供了一个方法 attach 用于将监听器附加到事件,并提供了一个方法 trigger 用于触发任何预定义的事件。一旦触发被调用,EventManager 就会调用附加到它的监听器。
EventManagerAwareInterface - 为了让一个类支持基于事件的编程,它需要实现 EventManagerAwareInterface。它提供了两个方法,setEventManager 和 getEventManager 用于获取和设置事件管理器。
示例
让我们编写一个简单的 PHP 控制台应用程序来理解事件管理器的概念。请按照以下步骤操作。
创建一个名为“eventapp”的文件夹。
使用 composer 安装zend-eventmanager。
在“eventapp”文件夹内创建一个 PHP 文件Greeter.php。
创建类Greeter并实现EventManagerAwareInterface。
require __DIR__ . '/vendor/autoload.php'; class Greeter implements EventManagerAwareInterface { // code }
这里,require 用于自动加载所有 composer 安装的组件。
在类Greeter中编写setEventManager方法,如下所示:
public function setEventManager(EventManagerInterface $events) { $events->setIdentifiers([ __CLASS__, get_called_class(),]); $this->events = $events; return $this; }
此方法将当前类设置为给定的事件管理器($events 参数),然后在局部变量$events中设置事件管理器。
下一步是在类Greeter中编写getEventManager方法,如下所示:
public function getEventManager() { if (null === $this->events) { $this->setEventManager(new EventManager()); } return $this->events; }
该方法从局部变量获取事件管理器。如果它不可用,则创建一个事件管理器的实例并返回它。
在类Greeter中编写一个方法greet。
public function greet($message) { printf("\"%s\" from class\n", $message); $this->getEventManager()->trigger(__FUNCTION__, $this, $message ]); }
此方法获取事件管理器并触发/触发附加到它的事件。
下一步是创建Greeter类的实例并将监听器附加到其方法greet。
$greeter = new Greeter(); $greeter->getEventManager()->attach('greet', function($e) { $event_name = $e->getName(); $target_name = get_class($e->getTarget()); $params_json = json_encode($e->getParams()); printf("\"%s\" event of class \"%s\" is called." . " The parameter supplied is %s\n", $event_name, $target_name, $params_json); });
监听器回调函数仅打印事件的名称、目标和提供的参数。
Greeter.php的完整列表如下:
<?php require __DIR__ . '/vendor/autoload.php'; use Zend\EventManager\EventManagerInterface; use Zend\EventManager\EventManager; use Zend\EventManager\EventManagerAwareInterface; class Greeter implements EventManagerAwareInterface { protected $events; public function setEventManager(EventManagerInterface $events) { $events->setIdentifiers([__CLASS__, get_called_class(), ]); $this->events = $events; return $this; } public function getEventManager() { if (null === $this->events) { $this->setEventManager(new EventManager()); } return $this->events; } public function greet($message) { printf("\"%s\" from class\n", $message); $this->getEventManager()->trigger(__FUNCTION__, $this, [$message ]); } } $greeter = new Greeter(); $greeter->greet("Hello"); $greeter->getEventManager()->attach('greet', function($e) { $event_name = $e->getName(); $target_name = get_class($e->getTarget()); $params_json = json_encode($e->getParams()); printf("\"%s\" event of class \"%s\" is called." . " The parameter supplied is %s\n", $event_name, $target_name, $params_json); }); $greeter->greet("Hello");
现在,在命令提示符 php Greeter.php 中运行应用程序,结果将如下所示:
"Hello" from class "Hello" from class "greet" event of class "Greeter" is called. The parameter supplied is ["Hello"]
以上示例应用程序仅解释了事件管理器的基础知识。事件管理器提供了更多高级选项,例如监听器优先级、自定义回调原型/签名、短路等。事件管理器在 Zend MVC 框架中被广泛使用。