📜  Zend框架-事件管理器

📅  最后修改于: 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。它提供了两个方法setEventManagergetEventManager来获取和设置事件管理器。

让我们编写一个简单的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框架中得到广泛使用。