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

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

Установить Event Manager

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

composer require zendframework/zend-eventmanager

Концепции Event Manager

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

  • Event - Событие - это произвольно названное действие, скажем greet.

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

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

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

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

пример

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

  • Создайте папку «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; 
}

Метод получает диспетчер событий из локальной переменной. если он недоступен, он создает экземпляр диспетчера событий и возвращает его.

Напишите метод, greet, в классе Greeter.

public function greet($message) { 
   printf("\"%s\" from class\n", $message); $this->getEventManager()->trigger(__FUNCTION__, $this, $message ]); 
}

Этот метод получает диспетчер событий и запускает / запускает связанные с ним события.

Следующим шагом будет создание экземпляра Greeter class и прикрепите слушателя к его методу, 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"]

В приведенном выше примере приложения объясняются только основы диспетчера событий. Менеджер событий предоставляет множество дополнительных опций, таких какListener Priority, Custom Callback Prototype / Signature, Short Circuiting, и т. д. Менеджер событий широко используется в среде Zend MVC.