Zend Framework - Gestionnaire d'événements

Toutes les applications modernes ont besoin de composants événementiels solides et flexibles. Zend Framework fournit un tel composant,zend-eventmanager. Le zend-eventmanager aide à concevoir une architecture de haut niveau et prend en charge la programmation orientée sujet / observateur et aspect.

Installez Event Manager

Le gestionnaire d'événements peut être installé à l'aide du Composer comme spécifié ci-dessous -

composer require zendframework/zend-eventmanager

Concepts du gestionnaire d'événements

Les concepts de base du gestionnaire d'événements sont les suivants -

  • Event - L'événement est une action nommée arbitrairement, par exemple greet.

  • Listener- Tout rappel PHP. Ils sont attachés aux événements et sont appelés lorsque l'événement est déclenché. La signature par défaut de Listener est -

function(EventInterface $e)
  • EventInterface Class- Utilisé pour spécifier l'événement lui-même. Il a des méthodes pour définir et obtenir des informations d'événement telles que le nom (set / getName), la cible (get / setTarget) et le paramètre (get / setParams).

  • EventManager class- L'instance de l'EventManager suit tous les événements définis dans une application et ses écouteurs correspondants. L'EventManager fournit une méthode,attach pour attacher un auditeur à un événement et il fournit une méthode, triggerpour déclencher tout événement prédéfini. Une fois le déclencheur appelé, EventManager appelle l'auditeur qui lui est attaché.

  • EventManagerAwareInterface- Pour qu'une classe prenne en charge la programmation basée sur les événements, elle doit implémenter EventManagerAwareInterface. Il propose deux méthodes,setEventManager et getEventManager pour obtenir et définir le gestionnaire d'événements.

Exemple

Écrivons une simple application de console PHP pour comprendre le concept de gestionnaire d'événements. Suivez les étapes ci-dessous.

  • Créez un dossier «eventapp».

  • Installer zend-eventmanager en utilisant le compositeur.

  • Créer un fichier PHP Greeter.php dans le dossier «eventapp».

  • Créer une classe Greeter et mettre en œuvre le EventManagerAwareInterface.

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

Ici, require est utilisé pour charger automatiquement tous les composants installés par composer.

Ecrire le setEventManager méthode en classe Greeter comme indiqué ci-dessous -

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

Cette méthode définit la classe actuelle dans le gestionnaire d'événements donné (argument $ events), puis définit le gestionnaire d'événements dans une variable locale $events.

La prochaine étape consiste à écrire le getEventManager méthode en classe Greeter comme indiqué ci-dessous -

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

La méthode obtient le gestionnaire d'événements à partir d'une variable locale. s'il n'est pas disponible, il crée une instance du gestionnaire d'événements et la renvoie.

Ecrire une méthode, greet, en classe Greeter.

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

Cette méthode obtient le gestionnaire d'événements et déclenche / déclenche les événements qui lui sont attachés.

L'étape suivante consiste à créer une instance du Greeter class et attachez un auditeur à sa méthode, 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); 
});

Le rappel de l'auditeur imprime simplement le nom de l'événement, la cible et les paramètres fournis.

La liste complète des Greeter.php est comme suit -

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

Maintenant, exécutez l'application dans l'invite de commande php Greeter.php et le résultat sera le suivant -

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

L'exemple d'application ci-dessus explique uniquement les bases d'un gestionnaire d'événements. Le gestionnaire d'événements fournit de nombreuses options plus avancées telles queListener Priority, Custom Callback Prototype / Signature, Short Circuiting, etc. Le gestionnaire d'événements est largement utilisé dans le framework Zend MVC.