Zend Framework - Event Manager

Alle modernen Anwendungen benötigen solide und flexible Ereigniskomponenten. Zend Framework bietet eine solche Komponente:zend-eventmanager. Der zend-eventmanager hilft beim Entwerfen einer Architektur auf hoher Ebene und unterstützt Subjekt- / Beobachtermuster und aspektorientierte Programmierung.

Installieren Sie den Event Manager

Der Event Manager kann mit dem installiert werden Composer wie unten angegeben -

composer require zendframework/zend-eventmanager

Konzepte des Event Managers

Die Kernkonzepte des Eventmanagers lauten wie folgt:

  • Event - Ereignis wird beispielsweise willkürlich als Aktion bezeichnet greet.

  • Listener- Jeder PHP-Rückruf. Sie sind an die Ereignisse angehängt und werden aufgerufen, wenn das Ereignis ausgelöst wird. Die Standardsignatur von Listener lautet -

function(EventInterface $e)
  • EventInterface Class- Wird verwendet, um das Ereignis selbst anzugeben. Es verfügt über Methoden zum Festlegen und Abrufen von Ereignisinformationen wie Name (set / getName), Ziel (get / setTarget) und Parameter (get / setParams).

  • EventManager class- Die Instanz des EventManager verfolgt alle definierten Ereignisse in einer Anwendung und die entsprechenden Listener. Der EventManager bietet eine Methode:attach um den Listener an ein Ereignis anzuhängen und eine Methode bereitzustellen, triggerum ein vordefiniertes Ereignis auszulösen. Sobald der Trigger aufgerufen wurde, ruft EventManager den ihm zugeordneten Listener auf.

  • EventManagerAwareInterface- Damit eine Klasse die ereignisbasierte Programmierung unterstützt, muss sie das EventManagerAwareInterface implementieren. Es bietet zwei Methoden:setEventManager und getEventManager um den Event Manager zu bekommen und einzustellen.

Beispiel

Lassen Sie uns eine einfache PHP-Konsolenanwendung schreiben, um das Event-Manager-Konzept zu verstehen. Befolgen Sie die unten angegebenen Schritte.

  • Erstellen Sie einen Ordner "eventapp".

  • Installieren zend-eventmanager mit dem Komponisten.

  • Erstellen Sie eine PHP-Datei Greeter.php im Ordner "eventapp".

  • Klasse erstellen Greeter und implementieren die EventManagerAwareInterface.

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

Hier, require wird verwendet, um alle vom Composer installierten Komponenten automatisch zu laden.

Schreiben Sie die setEventManager Methode in der Klasse Greeter wie unten gezeigt -

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

Diese Methode setzt die aktuelle Klasse in den angegebenen Ereignismanager (Argument $ events) und setzt dann den Ereignismanager in die lokale Variable $events.

Der nächste Schritt ist das Schreiben der getEventManager Methode in der Klasse Greeter wie unten gezeigt -

public function getEventManager() { 
   if (null === $this->events) { 
      $this->setEventManager(new EventManager()); 
   } 
   return $this->events; 
}

Die Methode ruft den Ereignismanager von einer lokalen Variablen ab. Wenn es nicht verfügbar ist, erstellt es eine Instanz des Ereignismanagers und gibt sie zurück.

Schreiben Sie eine Methode, greet, im Unterricht Greeter.

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

Diese Methode ruft den Ereignismanager ab und löst / löst damit verbundene Ereignisse aus.

Der nächste Schritt besteht darin, eine Instanz von zu erstellen Greeter Klasse und hängen Sie einen Listener an seine Methode, 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); 
});

Der Listener-Rückruf gibt nur den Namen des Ereignisses, des Ziels und der angegebenen Parameter aus.

Die vollständige Auflistung der Greeter.php ist wie folgt -

<?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");

Führen Sie nun die Anwendung in der Eingabeaufforderung PHP aus Greeter.php und das Ergebnis wird wie folgt sein -

"Hello" from class 
"Hello" from class 
"greet" event of class "Greeter" is called. The parameter supplied is ["Hello"]

In der obigen Beispielanwendung werden nur die Grundlagen eines Event-Managers erläutert. Der Event Manager bietet viele erweiterte Optionen wie zListener Priority, Custom Callback Prototype / Signature, Short Circuiting, usw. Der Event Manager wird häufig im Zend MVC-Framework verwendet.