所有现代应用程序都需要可靠而灵活的事件组件。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的完整列表如下-
<?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框架中得到广泛使用。
作者:terry,如若转载,请注明出处:https://www.web176.com/zendframework/306.html
支付宝
微信