Zend Framework - Administrador de eventos

Todas las aplicaciones modernas necesitan componentes de eventos sólidos y flexibles. Zend Framework proporciona uno de esos componentes,zend-eventmanager. El zend-eventmanager ayuda a diseñar una arquitectura de alto nivel y admite el patrón sujeto / observador y la programación orientada a aspectos.

Instalar Event Manager

El administrador de eventos se puede instalar usando el Composer como se especifica a continuación -

composer require zendframework/zend-eventmanager

Conceptos del administrador de eventos

Los conceptos centrales del administrador de eventos son los siguientes:

  • Event - El evento se denomina acción arbitrariamente, digamos greet.

  • Listener- Cualquier devolución de llamada de PHP. Se adjuntan a los eventos y se llaman cuando se activa el evento. La firma predeterminada de Listener es:

function(EventInterface $e)
  • EventInterface Class- Se utiliza para especificar el evento en sí. Tiene métodos para configurar y obtener información de eventos como nombre (set / getName), target (get / setTarget) y parámetro (get / setParams).

  • EventManager class- La instancia de EventManager rastrea todos los eventos definidos en una aplicación y sus correspondientes oyentes. EventManager proporciona un método,attach para adjuntar un oyente a un evento y proporciona un método, triggerpara activar cualquier evento predefinido. Una vez que se llama al disparador, EventManager llama al oyente adjunto.

  • EventManagerAwareInterface- Para que una clase admita la programación basada en eventos, debe implementar EventManagerAwareInterface. Proporciona dos métodos,setEventManager y getEventManager para obtener y configurar el administrador de eventos.

Ejemplo

Escribamos una aplicación de consola PHP simple para comprender el concepto de administrador de eventos. Siga los pasos que se indican a continuación.

  • Cree una carpeta "eventapp".

  • Instalar en pc zend-eventmanager usando el compositor.

  • Crea un archivo PHP Greeter.php dentro de la carpeta "eventapp".

  • Crear clase Greeter e implementar el EventManagerAwareInterface.

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

Aquí, require se utiliza para cargar automáticamente todos los componentes instalados en Composer.

Escribe el setEventManager método en clase Greeter como se muestra a continuación -

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

Este método establece la clase actual en el administrador de eventos dado (argumento $ events) y luego establece el administrador de eventos en la variable local $events.

El siguiente paso es escribir el getEventManager método en clase Greeter como se muestra a continuación -

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

El método obtiene el administrador de eventos de una variable local. si no está disponible, crea una instancia de administrador de eventos y la devuelve.

Escribe un método greet, en la clase Greeter.

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

Este método obtiene el administrador de eventos y activa / activa eventos adjuntos a él.

El siguiente paso es crear una instancia del Greeter class y adjuntar un oyente a su método, 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); 
});

La devolución de llamada del oyente simplemente imprime el nombre del evento, el objetivo y los parámetros proporcionados.

La lista completa de Greeter.php es como sigue -

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

Ahora, ejecute la aplicación en el símbolo del sistema php Greeter.php y el resultado será el siguiente:

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

La aplicación de muestra anterior explica solo los conceptos básicos de un administrador de eventos. El administrador de eventos ofrece muchas opciones más avanzadas, comoListener Priority, Custom Callback Prototype / Signature, Short Circuiting, etc. El administrador de eventos se utiliza ampliamente en el marco Zend MVC.