- Zend 框架教程
- Zend 框架 - 主页
- Zend 框架 - 简介
- Zend 框架 - 安装
- 骨架应用
- Zend 框架 - MVC 架构
- Zend 框架 - 概念
- Zend 框架 - 服务管理器
- Zend 框架 - 事件管理器
- Zend 框架 - 模块系统
- 应用结构
- Zend 框架 - 创建模块
- Zend 框架 - 控制器
- Zend 框架 - 路由
- Zend 框架 - 视图层
- Zend 框架 - 布局
- 模型和数据库
- 不同的数据库
- 表格和验证
- Zend 框架 - 文件上传
- Zend 框架 - Ajax
- Cookie 管理
- 会话管理
- Zend 框架 - 身份验证
- 电子邮件管理
- Zend 框架 - 单元测试
- Zend 框架 - 错误处理
- Zend 框架 - 工作示例
- Zend 框架有用的资源
- Zend 框架 - 快速指南
- Zend 框架 - 有用的资源
- Zend 框架 - 讨论
Zend 框架 - 事件管理器
所有现代应用程序都需要可靠且灵活的事件组件。Zend Framework 提供了一个这样的组件:zend-eventmanager。zend-eventmanager 有助于设计高级架构并支持主题/观察者模式和面向方面的编程。
安装事件管理器
可以使用Composer安装事件管理器,如下所示 -
composer require zendframework/zend-eventmanager
事件管理器的概念
事件管理器的核心概念如下 -
事件- 事件是任意命名的操作,例如greet。
Listener - 任何 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 框架中广泛使用。