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.