活动管理器的概念
事件管理器的核心概念如下 :
function(EventInterface $e)
-
EventInterface − 用于指定事件本身。它具有设置和获取事件信息的方法,例如name (set/getName), target (get/setTarget) 和 parameter (get/setParams)。
-
EventManager − 事件管理器的实例跟踪应用程序及其相应侦听器中所有已定义的事件。事件管理器提供了一个方法,attach将侦听器附加到事件,它提供了一个方法,trigger来触发任何预定义的事件。调用触发器后,事件管理器将调用附加到它的侦听器。
-
EventManagerAwareInterface − 对于支持基于事件的编程的类,它需要实现EventManagerAwareInterface。它提供了两种方法,setEventManager和getEventManager以获取和设置事件管理器。
例
让我们编写一个简单的 PHP 控制台应用程序来理解事件管理器的概念。请按照以下步骤操作。
-
创建一个文件夹“eventapp”。
-
使用Composer安装 zend-eventmanager 。
-
创建一个PHP文件Greeter.php在“eventapp”文件夹中。
-
创建类eventapp并实现EventManagerAwareInterface。
require __DIR__ . '/vendor/autoload.php';
class Greeter implements EventManagerAwareInterface {
// code
}
在这里,require 用于自动加载所有作曲家安装的组件。
在类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问候器中运行该应用程序.php结果将如下所示 -
"Hello" from class
"Hello" from class
"greet" event of class "Greeter" is called. The parameter supplied is ["Hello"]
上面的示例应用程序仅解释事件管理器的基础知识。事件管理器提供了许多更高级的选项Listener Priority, Custom Callback Prototype / Signature, Short Circuiting等。事件管理器在 Zend MVC 框架中被广泛使用。