39
www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl. Flávio Gomes da Silva Lisboa Gerenciando Aspectos e Eventos com Zend Framework 2

Gerenciando aspectos e eventos com Zend Framework 2

Embed Size (px)

DESCRIPTION

O objetivo desta palestra é apresentar o componente Zend_EventManager, que manipula tanto programação assíncrona quanto preocupações transversais em uma aplicação de uma forma coesa. Será apresentado um resumo sobre as abordagens de Aspectos, Filtros deInterceptação, Signal Slots e finalmente Eventos, para então mostrar a arquitetura e as funcionalidades do Zend_EventManager.

Citation preview

Page 1: Gerenciando aspectos e eventos com Zend Framework 2

www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.

Flávio Gomes da Silva Lisboa

Gerenciando Aspectos e Eventos com Zend Framework 2

Page 2: Gerenciando aspectos e eventos com Zend Framework 2

www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.

Quem sou eu

Autor

Instrutor

Arquiteto e DesenvolvedorCertificado

NOVO!

Page 3: Gerenciando aspectos e eventos com Zend Framework 2

www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.

Especialista em história em quadrinhos http://perse.doneit.com.br

romocavaleirodoespaco.blogspot.com

Page 4: Gerenciando aspectos e eventos com Zend Framework 2

www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.

Resumo

O objetivo desta palestra é apresentar o componente Zend_EventManager, que manipula tanto programação assíncrona quanto preocupações transversais em uma aplicação de uma forma coesa. Será apresentado um resumo sobre as abordagens de Aspectos, Filtros de Interceptação, Signal Slots e finalmente Eventos, para então mostrar a arquitetura e as funcionalidades do Zend_EventManager.

Page 5: Gerenciando aspectos e eventos com Zend Framework 2

EventManager

Page 6: Gerenciando aspectos e eventos com Zend Framework 2

Problemas...

Como nós introduzimos pontos de log/debug no código do framework?

Como nós permitimos a introdução de caching sem necessidade de estender o código do framework?

Como nós permitimos a introdução de validação, filtragem, verificações de controle de acesso, etc., sem necessariamente estender o código do framework?

Page 7: Gerenciando aspectos e eventos com Zend Framework 2

Problemas...

Como permitimos a manipulação da ordem na qual plugins, filtros de interceptação, eventos, etc., são disparados.

... Como resolver tudo isso?

Page 8: Gerenciando aspectos e eventos com Zend Framework 2

Solução: Programação Orientada a Aspectos

O código define vários “aspectos” que podem ser interessantes observar e/ou anexar a partir de um consumidor.

www.fgsl.eti.br

Palestras

Page 9: Gerenciando aspectos e eventos com Zend Framework 2

Solução: Programação Orientada a Aspectos

“Um aspecto é uma característicaligada a muitas partes de um programa”

“Um aspecto é um interesse transversal”

FGSL

Page 10: Gerenciando aspectos e eventos com Zend Framework 2

Interesses transversais

Interesses transversais geralmente são os trechos de código espalhados pela aplicação, como persistência, auditoria, controle de exceções, e quaisquer sequências que façam parte de métodos mas que não consigam ser transformados em métodos, ou que não possam ser herdados por todos que precisam deles.

Page 11: Gerenciando aspectos e eventos com Zend Framework 2

Interesses transversais

Classe A Classe B Classe C Classe D

Page 12: Gerenciando aspectos e eventos com Zend Framework 2

www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.

● A arma de reuso da orientação de objetos é a herança de classes.

● Algumas linguagens limitam a herança (caso de PHP) de modo que uma classe filha tem apenas uma classe mãe.

● A herança é total. Tudo o que for público e protegido é herdado.

Reuso limitado em POO

Page 13: Gerenciando aspectos e eventos com Zend Framework 2

www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.

● Mas existem trechos de código que se repetem, dentro de métodos diferentes.

● Esses trechos de código ficam espalhados em vários métodos de várias classes.

● Se não existe herança de método, quanto menos de trecho!

Reuso limitado em POO

Page 14: Gerenciando aspectos e eventos com Zend Framework 2

www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.

● O programa pode ser modularizado de uma forma somente a cada vez, e muitos tipos de interesses que não se alinham com essa modularização terminam espalhados por muitos módulos e emaranhados uns com os outros.

● Sebastian Bergmann

A Tirania da Decomposição Dominante

Page 15: Gerenciando aspectos e eventos com Zend Framework 2

Solução: Observador de Sujeitos

Prós Simples de entender Interfaces SPL são bem

conhecidas (mas limitadas)

Page 16: Gerenciando aspectos e eventos com Zend Framework 2

Solução: Observador de Sujeitos<?phpclass Building implements SplSubject{ private $observers; private $temperature;

public function attach(SplObserver $observer) { $this->observers[$observer]; }

public function dettach(SplObserver $observer) { if (in_array($observer, $this->observers)) unset($this->observers[$observer]); }

public function notify() { foreach ($this->observers as $observer) { $observer->notify($this); } }

Page 17: Gerenciando aspectos e eventos com Zend Framework 2

Solução: Observador de Sujeitos

<?php

public function measureTemperature() { if ($this->temperature > 40) { $this->notify(); } }

public function setTemperature($temperature) { $this->temperature = $temperature; }

}

Page 18: Gerenciando aspectos e eventos com Zend Framework 2

Solução: Observador de Sujeitos

<?phpclass Fireman implements SplObserver{ public function update(Building $subject) { $subject->setTemperature(36); }}

Page 19: Gerenciando aspectos e eventos com Zend Framework 2

Solução: Observador de Sujeitos

Contras Tipicamente, não pode interromper

a execução de observadores

remanescentes Requer um sistema para cada

componente e/ou classe Tipicamente, sem habilidade para priorizar

manipuladores.

Page 20: Gerenciando aspectos e eventos com Zend Framework 2

Solução: Publicador/Sobrescritor de Eventos

Prós Sobrescrita de notificações arbitrárias Tipicamente por componente + uso global; em

muitas linguagens, um único agregador global Paradigma bem-conhecido na programação de

interfaces com o usuário (pense em Javascript) Tende a ser um Turing completo

Page 21: Gerenciando aspectos e eventos com Zend Framework 2

Solução: Publicador/Sobrescritor de Eventos (PubSub)

Page 22: Gerenciando aspectos e eventos com Zend Framework 2

Solução: Publicador/Sobrescritor de Eventos (PubSub)

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Exemplo de evento</title> <script type="text/javascript" src="../dojotoolkit/dojo/dojo.js"></script> <script type="text/javascript" src="eventdojo02.js"></script></head><body> <select id="lista"> <option>D'Artagnan</option> <option>Athos</option> <option>Porthos</option> <option>Aramis</option> </select> <button id="incluir">Incluir</button></body></html>

Page 23: Gerenciando aspectos e eventos com Zend Framework 2

Solução: Publicador/Sobrescritor de Eventos (PubSub)

function identificarEvento(evt)

{

window.alert("você disparou o evento " + evt.type + " de " + evt.target);

}

dojo.addOnLoad(function() {

dojo.subscribe("eventHandler", identificarEvento);

dojo.connect(dojo.byId("lista"), "change", function(evt){

dojo.publish("eventHandler",evt);

});

dojo.connect(dojo.byId("incluir"), "click", function(evt){

dojo.publish("eventHandler",evt);

});

});

Page 24: Gerenciando aspectos e eventos com Zend Framework 2

Solução: Publicador/Sobrescritor de Eventos (PubSub)

Contras Frequentemente, precisa testar o evento fornecido

para garantir que você pode manipulá-lo. Uso global implica em agregação estática e/ou

dependências estáticas. … mas o uso por componente implica em um

boilerplate para compor em cada classe se ele for usado.

Tipicamente, sem habilidade para priorizar manipuladores.

Page 25: Gerenciando aspectos e eventos com Zend Framework 2

O que é boilerplate?

boilerplate é o termo usado para descrever seções de código que foram incluídas em muitos lugares com pouca ou nenhuma alteração.

Page 26: Gerenciando aspectos e eventos com Zend Framework 2

Solução: SignalSlots

Prós Conceito bem conhecido nos círculos de Ciência da

Computação O código emite sinais, que são interceptados por

slots (vulgos manipuladores) Tipicamente, compõe um gerenciador de sinais em

uma classe, mas pode ser integrado com um gerenciador global também

Geralmente tem algumas habilidades para priorizar manipuladores

Page 27: Gerenciando aspectos e eventos com Zend Framework 2

Solução: SignalSlots

Contras Esse palavreado não é bem conhecido entre

programadores PHP. Argumentos irão variar entre sinais. Os mesmos problemas com composição por classe

e uso estático como vemos em sistemas de eventos.

Page 28: Gerenciando aspectos e eventos com Zend Framework 2

Solução: Filtros de Interceptação

Prós Similar às soluções anteriores, exceto que cada

manipulador recebe a cadeia de filtros como um argumento, e é responsável por chamar o próximo na cadeia.

Frequentemente, o “trabalho” inteiro de um método é simplesmente executar um filtro.

Dependendo do projeto, pode permitir acesso global/estático.

Page 29: Gerenciando aspectos e eventos com Zend Framework 2

Solução: Filtros de Interceptação

Contras Algumas vezes é difícil acompanhar fluxos de

trabalho complexos. Os mesmos problemas com composição por classe

e uso estático como vemos em sistemas de evento. É fácil esquecer de invocar o próximo filtro na

cadeia. Tipicamente, sem habilidade de priorizar filtros.

Page 30: Gerenciando aspectos e eventos com Zend Framework 2

Mas qual a

solução afinal?

Page 31: Gerenciando aspectos e eventos com Zend Framework 2

Nenhuma!

Page 32: Gerenciando aspectos e eventos com Zend Framework 2

Todas!

Page 33: Gerenciando aspectos e eventos com Zend Framework 2

Linka

Ma-Ti Kwame

Wheeler

Gi

Co m

bina

ção

de P

oder

es

Page 34: Gerenciando aspectos e eventos com Zend Framework 2

ZF2: EventManager Component

A cereja do bolo de cada solução, Observer, SignalSlot, e Filtros de Interceptação, para prover uma solução compreensiva.

Não pode resolver completamente os problemas de composição/uso estático.

Nós podemos resolver o problema da composição no PHP 5.4 com traits.

Há formas elegantes de manipular o uso estático.

Page 35: Gerenciando aspectos e eventos com Zend Framework 2

Termos

EventManager: objeto que mantém uma coleção de ouvintes para um ou mais eventos nomeados e que dispara eventos.

Evento: uma ação disparada por um EventManager.

Ouvinte: um objeto que reage a um evento.

Page 36: Gerenciando aspectos e eventos com Zend Framework 2

Como criar

use Zend\EventManager\EventManager;

$eventManager = new EventManager();

Não precisa criar uma aplicação Zend Framework...

set_include_path(realpath(__DIR__ . '/../library/Zend') . PATH_SEPARATOR . get_include_path());

require_once 'Zend/Loader/StandardAutoloader.php';$loader = new Zend\Loader\StandardAutoloader();$loader->register();

class EventManager implements EventManagerInterface

Page 37: Gerenciando aspectos e eventos com Zend Framework 2

Como adicionar ouvintes

interface EventInterface

$eventName = 'begin';$callback = function($event){$class = get_class($event->getTarget());echo "event {$event->getName()} triggered by instance of {$class}";};

$eventManager->attach($eventName, $callback);

Page 38: Gerenciando aspectos e eventos com Zend Framework 2

Como disparar eventos

$eventManager->trigger('begin', $this);