Zend Framework - Gerenciador de Eventos

Todos os aplicativos modernos precisam de componentes de eventos sólidos e flexíveis. Zend Framework fornece um desses componentes,zend-eventmanager. O zend-eventmanager ajuda a projetar arquitetura de alto nível e oferece suporte a padrões de sujeito / observador e programação orientada a aspectos.

Instale o Event Manager

O gerenciador de eventos pode ser instalado usando o Composer conforme especificado abaixo -

composer require zendframework/zend-eventmanager

Conceitos do gerente de eventos

Os conceitos básicos do gerenciador de eventos são os seguintes -

  • Event - O evento é arbitrariamente denominado ação, digamos greet.

  • Listener- Qualquer retorno de chamada PHP. Eles são anexados aos eventos e são chamados quando o evento é acionado. A assinatura padrão do Listener é -

function(EventInterface $e)
  • EventInterface Class- Usado para especificar o próprio evento. Possui métodos para definir e obter informações do evento como nome (set / getName), destino (get / setTarget) e parâmetro (get / setParams).

  • EventManager class- A instância do EventManager rastreia todos os eventos definidos em um aplicativo e seus ouvintes correspondentes. O EventManager fornece um método,attach para anexar ouvinte a um evento e fornece um método, triggerpara acionar qualquer evento pré-definido. Assim que o gatilho é chamado, EventManager chama o ouvinte anexado a ele.

  • EventManagerAwareInterface- Para que uma classe ofereça suporte à programação baseada em eventos, ela precisa implementar o EventManagerAwareInterface. Ele fornece dois métodos,setEventManager e getEventManager para obter e definir o gerenciador de eventos.

Exemplo

Vamos escrever um aplicativo de console PHP simples para entender o conceito do gerenciador de eventos. Siga as etapas fornecidas abaixo.

  • Crie uma pasta “eventapp”.

  • Instalar zend-eventmanager usando o compositor.

  • Crie um arquivo PHP Greeter.php dentro da pasta “eventapp”.

  • Criar classe Greeter e implementar o EventManagerAwareInterface.

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

Aqui, require é usado para carregar automaticamente todos os componentes instalados do composer.

Escreva o setEventManager método na aula Greeter como mostrado abaixo -

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

Este método define a classe atual no gerenciador de eventos dado (argumento $ events) e então define o gerenciador de eventos na variável local $events.

A próxima etapa é escrever o getEventManager método na aula Greeter como mostrado abaixo -

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

O método obtém o gerenciador de eventos de uma variável local. se não estiver disponível, ele cria uma instância do gerenciador de eventos e o retorna.

Escreva um método, greet, em aula Greeter.

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

Este método obtém o gerenciador de eventos e dispara / dispara eventos anexados a ele.

A próxima etapa é criar uma instância do Greeter classe e anexar um ouvinte ao seu 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); 
});

O retorno de chamada do ouvinte apenas imprime o nome do evento, destino e os parâmetros fornecidos.

A lista completa do Greeter.php é o seguinte -

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

Agora, execute o aplicativo no prompt de comando php Greeter.php e o resultado será o seguinte -

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

O aplicativo de amostra acima explica apenas os fundamentos de um gerenciador de eventos. O gerenciador de eventos oferece muitas opções mais avançadas, comoListener Priority, Custom Callback Prototype / Signature, Short Circuiting, etc. O gerenciador de eventos é amplamente usado no framework Zend MVC.