📅  最后修改于: 2020-10-16 07:37:02             🧑  作者: Mango
所有现代应用程序都需要可靠而灵活的事件组件。 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提供了一种方法,可以将侦听器附加到事件,并提供一种方法,可以触发以触发任何预定义的事件。调用触发器后,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用于自动加载所有作曲家安装的组件。
在类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类中写一个招呼方法。
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的完整列表如下-
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框架中得到广泛使用。