所有现代应用程序都需要可靠而灵活的事件组件。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