Все современные приложения нуждаются в надежных и гибких компонентах событий. 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.