Учебники

Zend Framework — менеджер событий

Все современные приложения нуждаются в надежных и гибких компонентах событий. Zend Framework предоставляет один такой компонент, zend-eventmanager . Zend-eventmanager помогает проектировать архитектуру высокого уровня и поддерживает шаблон субъекта / наблюдателя и аспектно-ориентированное программирование.

Установить менеджер событий

Менеджер событий может быть установлен с помощью Composer, как указано ниже —

composer require zendframework/zend-eventmanager 

Концепции менеджера событий

Основные понятия менеджера событий следующие:

  • Событие — Событие называется произвольно, например, приветствие .

  • Listener — любой обратный вызов PHP. Они привязаны к событиям и вызываются при их запуске. Подпись слушателя по умолчанию —

Событие — Событие называется произвольно, например, приветствие .

Listener — любой обратный вызов PHP. Они привязаны к событиям и вызываются при их запуске. Подпись слушателя по умолчанию —

function(EventInterface $e)
  • Класс EventInterface — используется для указания самого события. У него есть методы для установки и получения информации о событии, например, имя (set / getName), цель (get / setTarget) и параметр (get / setParams).

  • Класс EventManager — Экземпляр EventManager отслеживает все определенные события в приложении и его соответствующих слушателях. EventManager предоставляет метод прикрепления для присоединения слушателя к событию, а также метод, запускающий любое предопределенное событие. После вызова триггера EventManager вызывает подключенный к нему слушатель.

  • EventManagerAwareInterface — для класса, поддерживающего программирование на основе событий, ему необходимо реализовать EventManagerAwareInterface. Он предоставляет два метода, setEventManager и getEventManager для получения и установки менеджера событий.

Класс EventInterface — используется для указания самого события. У него есть методы для установки и получения информации о событии, например, имя (set / getName), цель (get / setTarget) и параметр (get / setParams).

Класс EventManager — Экземпляр EventManager отслеживает все определенные события в приложении и его соответствующих слушателях. EventManager предоставляет метод прикрепления для присоединения слушателя к событию, а также метод, запускающий любое предопределенное событие. После вызова триггера EventManager вызывает подключенный к нему слушатель.

EventManagerAwareInterface — для класса, поддерживающего программирование на основе событий, ему необходимо реализовать EventManagerAwareInterface. Он предоставляет два метода, setEventManager и getEventManager для получения и установки менеджера событий.

пример

Давайте напишем простое консольное приложение PHP, чтобы понять концепцию менеджера событий. Следуйте инструкциям ниже.

  • Создайте папку «Eventapp».

  • Установите zend-eventmanager, используя композитор.

  • Создайте PHP-файл Greeter.php в папке eventapp.

  • Создайте класс Greeter и реализуйте EventManagerAwareInterface .

Создайте папку «Eventapp».

Установите zend-eventmanager, используя композитор.

Создайте PHP-файл Greeter.php в папке eventapp.

Создайте класс Greeter и реализуйте EventManagerAwareInterface .

require __DIR__ . '/vendor/autoload.php'; 
class Greeter implements EventManagerAwareInterface { 
   // code 
}

Здесь require используется для автозагрузки всех компонентов, установленных композитором.

Напишите метод setEventManager в классе Greeter, как показано ниже —

public function setEventManager(EventManagerInterface $events) { 
   $events->setIdentifiers([ __CLASS__, get_called_class(),]); 
   $this->events = $events; 
   return $this; 
}

Этот метод устанавливает текущий класс в данный менеджер событий (аргумент $ events), а затем устанавливает менеджер событий в локальной переменной $ events .

Следующим шагом является написание метода getEventManager в классе Greeter, как показано ниже —

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.