Zend Framework - 事件管理器

  • 简述

    所有现代应用都需要坚固而灵活的事件组件。Zend 框架提供了一个这样的组件,zend-eventmanager。zend-eventmanager有助于设计高级架构,并支持主题/观察者模式和面向切面(AOP)的编程。
  • 安装事件管理器

    事件管理器可以使用下面指定的Composer进行安装 −
    
    composer require zendframework/zend-eventmanager 
    
  • 活动管理器的概念

    事件管理器的核心概念如下 :
    • Event − 事件被任意命名为操作,说问候
    • Listener − 任何 PHP 回调。它们附加到事件,并在触发事件时被调用。监听器的默认签名是 −
    
    function(EventInterface $e)
    
    • EventInterface − 用于指定事件本身。它具有设置和获取事件信息的方法,例如name (set/getName), target (get/setTarget) 和 parameter (get/setParams)。
    • EventManager − 事件管理器的实例跟踪应用程序及其相应侦听器中所有已定义的事件。事件管理器提供了一个方法,attach将侦听器附加到事件,它提供了一个方法,trigger来触发任何预定义的事件。调用触发器后,事件管理器将调用附加到它的侦听器。
    • EventManagerAwareInterface − 对于支持基于事件的编程的类,它需要实现EventManagerAwareInterface。它提供了两种方法,setEventManagergetEventManager以获取和设置事件管理器。

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