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.