SlideShare una empresa de Scribd logo
1 de 39
Descargar para leer sin conexión
Gerenciando Aspectos e Eventos
   com Zend Framework 2
           Flávio Gomes da Silva Lisboa




 www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Quem sou eu                                      NOVO!




  Autor


Arquiteto e Desenvolvedor
                                                          Certificado
                                    Instrutor


   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




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.



    www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
EventManager
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?
Problemas...

   Como permitimos a manipulação da ordem na
    qual plugins, filtros de interceptação, eventos,
    etc., são disparados.
   ...
   Como resolver tudo isso?
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
Solução: Programação Orientada
          a Aspectos
“Um aspecto é uma característica
ligada a muitas partes de um
programa”


“Um aspecto é um interesse
transversal”
               FGSL
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.
Interesses transversais




Classe A   Classe B   Classe C   Classe D
Reuso limitado em POO
●   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.




        www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Reuso limitado em POO
●   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!




       www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
A Tirania da Decomposição
                  Dominante
●   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




         www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Solução: Observador de Sujeitos

   Prós
       Simples de entender
       Interfaces SPL são bem
        conhecidas (mas limitadas)
Solução: Observador de Sujeitos
 <?php
 class 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);
        }
    }
Solução: Observador de Sujeitos
   <?php

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

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

   }
Solução: Observador de Sujeitos



    <?php
    class Fireman implements SplObserver
    {
         public function update(Building $subject)
        {
            $subject->setTemperature(36);
        }
    }
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.
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
Solução: Publicador/Sobrescritor
     de Eventos (PubSub)
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>
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);

});

});
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.
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.
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
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.
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.
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.
Mas
 qual a
solução
 afinal?
Nenhuma!
Todas!
Combinação




                               de Poderes
                                            Linka
Wheeler




 Gi                    Ma-Ti                    Kwame
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.
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.
Como criar
      class EventManager implements EventManagerInterface



 use ZendEventManagerEventManager;

 $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 ZendLoaderStandardAutoloader();
$loader->register();
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);
Como disparar eventos


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

    www.fgsl.eti.br
flavio.lisboa@fgsl.eti.br
         @fgsl

Más contenido relacionado

La actualidad más candente

LabMM3 - Aula teórica 08
LabMM3 - Aula teórica 08LabMM3 - Aula teórica 08
LabMM3 - Aula teórica 08Carlos Santos
 
IAsyncResult Pattern ou Asynchronous Programming Model (APM)
IAsyncResult Pattern ou Asynchronous Programming Model (APM)IAsyncResult Pattern ou Asynchronous Programming Model (APM)
IAsyncResult Pattern ou Asynchronous Programming Model (APM)Rogério Moraes de Carvalho
 
Tratamento de exceções em Java
Tratamento de exceções em JavaTratamento de exceções em Java
Tratamento de exceções em JavaWilson Júnior
 
Programação assíncrona com C# 5 no Visual Studio 2013 [MVP ShowCast 2013 - DE...
Programação assíncrona com C# 5 no Visual Studio 2013 [MVP ShowCast 2013 - DE...Programação assíncrona com C# 5 no Visual Studio 2013 [MVP ShowCast 2013 - DE...
Programação assíncrona com C# 5 no Visual Studio 2013 [MVP ShowCast 2013 - DE...Rogério Moraes de Carvalho
 
Django - A sua cápsula de soluções web em python
Django - A sua cápsula de soluções web em pythonDjango - A sua cápsula de soluções web em python
Django - A sua cápsula de soluções web em pythonPaula Grangeiro
 
Android DevConference - Automatizando testes sem sofrimento
Android DevConference - Automatizando testes sem sofrimentoAndroid DevConference - Automatizando testes sem sofrimento
Android DevConference - Automatizando testes sem sofrimentoiMasters
 
06 breve histórico do action script - Flash 8
06 breve histórico do action script - Flash 806 breve histórico do action script - Flash 8
06 breve histórico do action script - Flash 8Reuel Lopes
 
Interfacestangiveiscomputacaovisual
InterfacestangiveiscomputacaovisualInterfacestangiveiscomputacaovisual
InterfacestangiveiscomputacaovisualCampus Party Brasil
 

La actualidad más candente (20)

LabMM3 - Aula teórica 08
LabMM3 - Aula teórica 08LabMM3 - Aula teórica 08
LabMM3 - Aula teórica 08
 
Java script
Java scriptJava script
Java script
 
Introdução ao vraptor
Introdução ao vraptorIntrodução ao vraptor
Introdução ao vraptor
 
Apres s4
Apres s4 Apres s4
Apres s4
 
Consegi 2011: Puppet
Consegi 2011: PuppetConsegi 2011: Puppet
Consegi 2011: Puppet
 
Igor Oliveira - Puppet
Igor Oliveira - PuppetIgor Oliveira - Puppet
Igor Oliveira - Puppet
 
Clean code part 2
Clean code   part 2Clean code   part 2
Clean code part 2
 
burlando um WAF
burlando um WAFburlando um WAF
burlando um WAF
 
IAsyncResult Pattern ou Asynchronous Programming Model (APM)
IAsyncResult Pattern ou Asynchronous Programming Model (APM)IAsyncResult Pattern ou Asynchronous Programming Model (APM)
IAsyncResult Pattern ou Asynchronous Programming Model (APM)
 
Excepções JAVA
Excepções JAVAExcepções JAVA
Excepções JAVA
 
Tratamento de exceções em Java
Tratamento de exceções em JavaTratamento de exceções em Java
Tratamento de exceções em Java
 
Burlando Waf 2.0
Burlando Waf  2.0Burlando Waf  2.0
Burlando Waf 2.0
 
Tratamento de exceções em Java
Tratamento de exceções em JavaTratamento de exceções em Java
Tratamento de exceções em Java
 
Programação assíncrona com C# 5 no Visual Studio 2013 [MVP ShowCast 2013 - DE...
Programação assíncrona com C# 5 no Visual Studio 2013 [MVP ShowCast 2013 - DE...Programação assíncrona com C# 5 no Visual Studio 2013 [MVP ShowCast 2013 - DE...
Programação assíncrona com C# 5 no Visual Studio 2013 [MVP ShowCast 2013 - DE...
 
Resumo OpenMP
Resumo OpenMPResumo OpenMP
Resumo OpenMP
 
Django - A sua cápsula de soluções web em python
Django - A sua cápsula de soluções web em pythonDjango - A sua cápsula de soluções web em python
Django - A sua cápsula de soluções web em python
 
Android DevConference - Automatizando testes sem sofrimento
Android DevConference - Automatizando testes sem sofrimentoAndroid DevConference - Automatizando testes sem sofrimento
Android DevConference - Automatizando testes sem sofrimento
 
06 breve histórico do action script - Flash 8
06 breve histórico do action script - Flash 806 breve histórico do action script - Flash 8
06 breve histórico do action script - Flash 8
 
Vivendo de hacking
Vivendo de hackingVivendo de hacking
Vivendo de hacking
 
Interfacestangiveiscomputacaovisual
InterfacestangiveiscomputacaovisualInterfacestangiveiscomputacaovisual
Interfacestangiveiscomputacaovisual
 

Destacado

Keeping a Seed of Solutions when Energy and Climate become Unpredictable
Keeping a Seed of Solutions when Energy and Climate become UnpredictableKeeping a Seed of Solutions when Energy and Climate become Unpredictable
Keeping a Seed of Solutions when Energy and Climate become UnpredictableCIAT
 
MVC com Zend Framework - PHP Conference Brasil 2010
MVC com Zend Framework - PHP Conference Brasil 2010MVC com Zend Framework - PHP Conference Brasil 2010
MVC com Zend Framework - PHP Conference Brasil 2010Flávio Lisboa
 
Eagle Revisions
Eagle RevisionsEagle Revisions
Eagle RevisionsMABSIV
 
Green Bank Experience - Group and Individual Liability Micro-Lending
Green Bank Experience -  Group and Individual Liability Micro-LendingGreen Bank Experience -  Group and Individual Liability Micro-Lending
Green Bank Experience - Group and Individual Liability Micro-LendingMABSIV
 
BSP Circular 678
BSP Circular 678BSP Circular 678
BSP Circular 678MABSIV
 
Put Social Media To Work For You And Your Company
Put Social Media To Work For You And Your CompanyPut Social Media To Work For You And Your Company
Put Social Media To Work For You And Your CompanyKatherine Swartz Hilton
 
General Capabilities
General CapabilitiesGeneral Capabilities
General CapabilitiesJavier Labbe
 
Beans and Eco-efficiency in a Changing Environment
Beans and Eco-efficiency in a Changing EnvironmentBeans and Eco-efficiency in a Changing Environment
Beans and Eco-efficiency in a Changing EnvironmentCIAT
 
Give yourself some credits
Give yourself some creditsGive yourself some credits
Give yourself some creditsArvin Alpuerto
 
Top picks julho13_2
Top picks julho13_2Top picks julho13_2
Top picks julho13_2akimor
 
Wecabren outcome6 ppt rm2
Wecabren outcome6 ppt rm2Wecabren outcome6 ppt rm2
Wecabren outcome6 ppt rm2CIAT
 
Housing Microfinance
Housing MicrofinanceHousing Microfinance
Housing MicrofinanceMABSIV
 
A Beleza Da Matematica
A Beleza Da MatematicaA Beleza Da Matematica
A Beleza Da MatematicaKeusley
 
4velas
4velas4velas
4velasaleah
 
Ondernemersplein Stipo deel2
Ondernemersplein Stipo deel2Ondernemersplein Stipo deel2
Ondernemersplein Stipo deel2Stipo
 
Como o governo do Brasil usa PHP
Como o governo do Brasil usa PHPComo o governo do Brasil usa PHP
Como o governo do Brasil usa PHPFlávio Lisboa
 

Destacado (20)

Keeping a Seed of Solutions when Energy and Climate become Unpredictable
Keeping a Seed of Solutions when Energy and Climate become UnpredictableKeeping a Seed of Solutions when Energy and Climate become Unpredictable
Keeping a Seed of Solutions when Energy and Climate become Unpredictable
 
MVC com Zend Framework - PHP Conference Brasil 2010
MVC com Zend Framework - PHP Conference Brasil 2010MVC com Zend Framework - PHP Conference Brasil 2010
MVC com Zend Framework - PHP Conference Brasil 2010
 
Eagle Revisions
Eagle RevisionsEagle Revisions
Eagle Revisions
 
Green Bank Experience - Group and Individual Liability Micro-Lending
Green Bank Experience -  Group and Individual Liability Micro-LendingGreen Bank Experience -  Group and Individual Liability Micro-Lending
Green Bank Experience - Group and Individual Liability Micro-Lending
 
BSP Circular 678
BSP Circular 678BSP Circular 678
BSP Circular 678
 
Put Social Media To Work For You And Your Company
Put Social Media To Work For You And Your CompanyPut Social Media To Work For You And Your Company
Put Social Media To Work For You And Your Company
 
General Capabilities
General CapabilitiesGeneral Capabilities
General Capabilities
 
Beans and Eco-efficiency in a Changing Environment
Beans and Eco-efficiency in a Changing EnvironmentBeans and Eco-efficiency in a Changing Environment
Beans and Eco-efficiency in a Changing Environment
 
Give yourself some credits
Give yourself some creditsGive yourself some credits
Give yourself some credits
 
Top picks julho13_2
Top picks julho13_2Top picks julho13_2
Top picks julho13_2
 
Wecabren outcome6 ppt rm2
Wecabren outcome6 ppt rm2Wecabren outcome6 ppt rm2
Wecabren outcome6 ppt rm2
 
Housing Microfinance
Housing MicrofinanceHousing Microfinance
Housing Microfinance
 
A Beleza Da Matematica
A Beleza Da MatematicaA Beleza Da Matematica
A Beleza Da Matematica
 
Change 5 0
Change 5 0Change 5 0
Change 5 0
 
4velas
4velas4velas
4velas
 
Ondernemersplein Stipo deel2
Ondernemersplein Stipo deel2Ondernemersplein Stipo deel2
Ondernemersplein Stipo deel2
 
Julián ruiz
Julián ruizJulián ruiz
Julián ruiz
 
Como o governo do Brasil usa PHP
Como o governo do Brasil usa PHPComo o governo do Brasil usa PHP
Como o governo do Brasil usa PHP
 
Manual
ManualManual
Manual
 
Trading StocksSemanal16/03/2012
Trading StocksSemanal16/03/2012Trading StocksSemanal16/03/2012
Trading StocksSemanal16/03/2012
 

Similar a Gerenciando aspectos e eventos com Zend Framework 2

TDC2016SP - Trilha Microservices
TDC2016SP - Trilha MicroservicesTDC2016SP - Trilha Microservices
TDC2016SP - Trilha Microservicestdc-globalcode
 
Apresentação final
Apresentação finalApresentação final
Apresentação finalvalmon
 
Como DDD e Strategic Design estão nos ajudando a modernizar um Legado
Como DDD e Strategic Design estão nos ajudando a modernizar um LegadoComo DDD e Strategic Design estão nos ajudando a modernizar um Legado
Como DDD e Strategic Design estão nos ajudando a modernizar um LegadoLuiz Costa
 
POO2-Pre-32-PadroesProjetos_.pdf
POO2-Pre-32-PadroesProjetos_.pdfPOO2-Pre-32-PadroesProjetos_.pdf
POO2-Pre-32-PadroesProjetos_.pdfAndreCosta502039
 
Automação de Aplicativos: Scripting com Python
Automação de Aplicativos: Scripting com PythonAutomação de Aplicativos: Scripting com Python
Automação de Aplicativos: Scripting com PythonFabio Spanhol
 
Orientação a Objetos com Python e UML - XIII FGSL
Orientação a Objetos com Python e UML - XIII FGSLOrientação a Objetos com Python e UML - XIII FGSL
Orientação a Objetos com Python e UML - XIII FGSLGeorge Mendonça
 
Construção de Frameworks com Annotation e Reflection API em Java
Construção de Frameworks com Annotation e Reflection API em JavaConstrução de Frameworks com Annotation e Reflection API em Java
Construção de Frameworks com Annotation e Reflection API em JavaFernando Camargo
 
Paradigmas De Linguagem De Programação.
Paradigmas De Linguagem De Programação.Paradigmas De Linguagem De Programação.
Paradigmas De Linguagem De Programação.Valmon Gaudencio
 
Modelagem de sistemas
Modelagem de sistemasModelagem de sistemas
Modelagem de sistemassauloroos01
 
1001 maneiras de debugar o WordPress
1001 maneiras de debugar o WordPress1001 maneiras de debugar o WordPress
1001 maneiras de debugar o WordPressRudá Almeida
 
Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5Lucas Augusto Carvalho
 
Visualg 1231617089791929-2
Visualg 1231617089791929-2Visualg 1231617089791929-2
Visualg 1231617089791929-2jaoozinhoqi123
 
T10_LM3: Subalgoritmos/funções (2013-2014)
T10_LM3: Subalgoritmos/funções (2013-2014)T10_LM3: Subalgoritmos/funções (2013-2014)
T10_LM3: Subalgoritmos/funções (2013-2014)Carlos Santos
 
Aplicações Profissionais para Internet com Zend Framework
Aplicações Profissionais para Internet com Zend FrameworkAplicações Profissionais para Internet com Zend Framework
Aplicações Profissionais para Internet com Zend FrameworkFlávio Lisboa
 
Pense no futuro: PHP com Zend Framework
Pense no futuro: PHP com Zend FrameworkPense no futuro: PHP com Zend Framework
Pense no futuro: PHP com Zend FrameworkFlávio Lisboa
 

Similar a Gerenciando aspectos e eventos com Zend Framework 2 (20)

TDC2016SP - Trilha Microservices
TDC2016SP - Trilha MicroservicesTDC2016SP - Trilha Microservices
TDC2016SP - Trilha Microservices
 
Apresentação final
Apresentação finalApresentação final
Apresentação final
 
Como DDD e Strategic Design estão nos ajudando a modernizar um Legado
Como DDD e Strategic Design estão nos ajudando a modernizar um LegadoComo DDD e Strategic Design estão nos ajudando a modernizar um Legado
Como DDD e Strategic Design estão nos ajudando a modernizar um Legado
 
POO2-Pre-32-PadroesProjetos_.pdf
POO2-Pre-32-PadroesProjetos_.pdfPOO2-Pre-32-PadroesProjetos_.pdf
POO2-Pre-32-PadroesProjetos_.pdf
 
Automação de Aplicativos: Scripting com Python
Automação de Aplicativos: Scripting com PythonAutomação de Aplicativos: Scripting com Python
Automação de Aplicativos: Scripting com Python
 
Orientação a Objetos com Python e UML - XIII FGSL
Orientação a Objetos com Python e UML - XIII FGSLOrientação a Objetos com Python e UML - XIII FGSL
Orientação a Objetos com Python e UML - XIII FGSL
 
Construção de Frameworks com Annotation e Reflection API em Java
Construção de Frameworks com Annotation e Reflection API em JavaConstrução de Frameworks com Annotation e Reflection API em Java
Construção de Frameworks com Annotation e Reflection API em Java
 
Paradigmas De Linguagem De Programação.
Paradigmas De Linguagem De Programação.Paradigmas De Linguagem De Programação.
Paradigmas De Linguagem De Programação.
 
Modelagem de sistemas
Modelagem de sistemasModelagem de sistemas
Modelagem de sistemas
 
1001 maneiras de debugar o WordPress
1001 maneiras de debugar o WordPress1001 maneiras de debugar o WordPress
1001 maneiras de debugar o WordPress
 
poster
posterposter
poster
 
Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5
 
Visualg 1231617089791929-2
Visualg 1231617089791929-2Visualg 1231617089791929-2
Visualg 1231617089791929-2
 
Visualg
VisualgVisualg
Visualg
 
T10_LM3: Subalgoritmos/funções (2013-2014)
T10_LM3: Subalgoritmos/funções (2013-2014)T10_LM3: Subalgoritmos/funções (2013-2014)
T10_LM3: Subalgoritmos/funções (2013-2014)
 
Java Seminar
Java SeminarJava Seminar
Java Seminar
 
Aplicações Profissionais para Internet com Zend Framework
Aplicações Profissionais para Internet com Zend FrameworkAplicações Profissionais para Internet com Zend Framework
Aplicações Profissionais para Internet com Zend Framework
 
Calourada2010
Calourada2010Calourada2010
Calourada2010
 
Pense no futuro: PHP com Zend Framework
Pense no futuro: PHP com Zend FrameworkPense no futuro: PHP com Zend Framework
Pense no futuro: PHP com Zend Framework
 
Code Smells
Code SmellsCode Smells
Code Smells
 

Más de Flávio Lisboa

Criando testes integrados de APIs com PHP
Criando testes integrados de APIs com PHPCriando testes integrados de APIs com PHP
Criando testes integrados de APIs com PHPFlávio Lisboa
 
Cooperativas de Software Livre: Uma comparação entre Brasil e Argentina
Cooperativas de Software Livre: Uma comparação entre Brasil e ArgentinaCooperativas de Software Livre: Uma comparação entre Brasil e Argentina
Cooperativas de Software Livre: Uma comparação entre Brasil e ArgentinaFlávio Lisboa
 
Aprenda a afiar suas garras com Laminas
Aprenda a afiar suas garras com LaminasAprenda a afiar suas garras com Laminas
Aprenda a afiar suas garras com LaminasFlávio Lisboa
 
Ciência e software livre: desenvolvendo com método
Ciência e software livre: desenvolvendo com métodoCiência e software livre: desenvolvendo com método
Ciência e software livre: desenvolvendo com métodoFlávio Lisboa
 
Turbinando microsserviços em PHP
Turbinando microsserviços em PHPTurbinando microsserviços em PHP
Turbinando microsserviços em PHPFlávio Lisboa
 
O que esperar do framework Laminas
O que esperar do framework LaminasO que esperar do framework Laminas
O que esperar do framework LaminasFlávio Lisboa
 
PHP Conference Brazil - What can we expect about framework Laminas?
PHP Conference Brazil - What can we expect about framework Laminas?PHP Conference Brazil - What can we expect about framework Laminas?
PHP Conference Brazil - What can we expect about framework Laminas?Flávio Lisboa
 
Algoritmos Genéticos em PHP - PHP Conference Brasil 2019
Algoritmos Genéticos em PHP - PHP Conference Brasil 2019Algoritmos Genéticos em PHP - PHP Conference Brasil 2019
Algoritmos Genéticos em PHP - PHP Conference Brasil 2019Flávio Lisboa
 
Criando microsserviços em PHP
Criando microsserviços em PHPCriando microsserviços em PHP
Criando microsserviços em PHPFlávio Lisboa
 
Como se tornar o pior programador PHP do mundo
Como se tornar o pior programador PHP do mundoComo se tornar o pior programador PHP do mundo
Como se tornar o pior programador PHP do mundoFlávio Lisboa
 
A demanda da santa entrega Batman: bugs e gargalos em aplicações PHP
A demanda da santa entrega Batman: bugs e gargalos em aplicações PHPA demanda da santa entrega Batman: bugs e gargalos em aplicações PHP
A demanda da santa entrega Batman: bugs e gargalos em aplicações PHPFlávio Lisboa
 
Comunicação e padrões em código aberto: quando convergente e divergente cooperam
Comunicação e padrões em código aberto: quando convergente e divergente cooperamComunicação e padrões em código aberto: quando convergente e divergente cooperam
Comunicação e padrões em código aberto: quando convergente e divergente cooperamFlávio Lisboa
 
Criação de robôs em PHP para raspagem de dados
Criação de robôs em PHP para raspagem de dadosCriação de robôs em PHP para raspagem de dados
Criação de robôs em PHP para raspagem de dadosFlávio Lisboa
 
Estudo de Caso: Utilização de PHP no Serviço Federal de Processamento de Dados
Estudo de Caso: Utilização de PHP no Serviço Federal de Processamento de DadosEstudo de Caso: Utilização de PHP no Serviço Federal de Processamento de Dados
Estudo de Caso: Utilização de PHP no Serviço Federal de Processamento de DadosFlávio Lisboa
 
Arquitetura PHP para um mundo orientado a microsserviços
Arquitetura PHP para um mundo orientado a microsserviçosArquitetura PHP para um mundo orientado a microsserviços
Arquitetura PHP para um mundo orientado a microsserviçosFlávio Lisboa
 
Semeando Liberdade: Como (e onde) o software livre inclui as pessoas
Semeando Liberdade: Como (e onde) o software livre inclui as pessoasSemeando Liberdade: Como (e onde) o software livre inclui as pessoas
Semeando Liberdade: Como (e onde) o software livre inclui as pessoasFlávio Lisboa
 
O que é programação de computadores
O que é programação de computadoresO que é programação de computadores
O que é programação de computadoresFlávio Lisboa
 
Economia em rede (comunidade)
Economia em rede (comunidade)Economia em rede (comunidade)
Economia em rede (comunidade)Flávio Lisboa
 
Aplicações Corporativas em PHP (CRM e ERP)
Aplicações Corporativas em PHP (CRM e ERP)Aplicações Corporativas em PHP (CRM e ERP)
Aplicações Corporativas em PHP (CRM e ERP)Flávio Lisboa
 

Más de Flávio Lisboa (20)

Criando testes integrados de APIs com PHP
Criando testes integrados de APIs com PHPCriando testes integrados de APIs com PHP
Criando testes integrados de APIs com PHP
 
Cooperativas de Software Livre: Uma comparação entre Brasil e Argentina
Cooperativas de Software Livre: Uma comparação entre Brasil e ArgentinaCooperativas de Software Livre: Uma comparação entre Brasil e Argentina
Cooperativas de Software Livre: Uma comparação entre Brasil e Argentina
 
Aprenda a afiar suas garras com Laminas
Aprenda a afiar suas garras com LaminasAprenda a afiar suas garras com Laminas
Aprenda a afiar suas garras com Laminas
 
Ciência e software livre: desenvolvendo com método
Ciência e software livre: desenvolvendo com métodoCiência e software livre: desenvolvendo com método
Ciência e software livre: desenvolvendo com método
 
Turbinando microsserviços em PHP
Turbinando microsserviços em PHPTurbinando microsserviços em PHP
Turbinando microsserviços em PHP
 
O que esperar do framework Laminas
O que esperar do framework LaminasO que esperar do framework Laminas
O que esperar do framework Laminas
 
PHP Conference Brazil - What can we expect about framework Laminas?
PHP Conference Brazil - What can we expect about framework Laminas?PHP Conference Brazil - What can we expect about framework Laminas?
PHP Conference Brazil - What can we expect about framework Laminas?
 
Algoritmos Genéticos em PHP - PHP Conference Brasil 2019
Algoritmos Genéticos em PHP - PHP Conference Brasil 2019Algoritmos Genéticos em PHP - PHP Conference Brasil 2019
Algoritmos Genéticos em PHP - PHP Conference Brasil 2019
 
Criando microsserviços em PHP
Criando microsserviços em PHPCriando microsserviços em PHP
Criando microsserviços em PHP
 
Como se tornar o pior programador PHP do mundo
Como se tornar o pior programador PHP do mundoComo se tornar o pior programador PHP do mundo
Como se tornar o pior programador PHP do mundo
 
A demanda da santa entrega Batman: bugs e gargalos em aplicações PHP
A demanda da santa entrega Batman: bugs e gargalos em aplicações PHPA demanda da santa entrega Batman: bugs e gargalos em aplicações PHP
A demanda da santa entrega Batman: bugs e gargalos em aplicações PHP
 
Comunicação e padrões em código aberto: quando convergente e divergente cooperam
Comunicação e padrões em código aberto: quando convergente e divergente cooperamComunicação e padrões em código aberto: quando convergente e divergente cooperam
Comunicação e padrões em código aberto: quando convergente e divergente cooperam
 
Criação de robôs em PHP para raspagem de dados
Criação de robôs em PHP para raspagem de dadosCriação de robôs em PHP para raspagem de dados
Criação de robôs em PHP para raspagem de dados
 
Amanhecer esmeralda
Amanhecer esmeraldaAmanhecer esmeralda
Amanhecer esmeralda
 
Estudo de Caso: Utilização de PHP no Serviço Federal de Processamento de Dados
Estudo de Caso: Utilização de PHP no Serviço Federal de Processamento de DadosEstudo de Caso: Utilização de PHP no Serviço Federal de Processamento de Dados
Estudo de Caso: Utilização de PHP no Serviço Federal de Processamento de Dados
 
Arquitetura PHP para um mundo orientado a microsserviços
Arquitetura PHP para um mundo orientado a microsserviçosArquitetura PHP para um mundo orientado a microsserviços
Arquitetura PHP para um mundo orientado a microsserviços
 
Semeando Liberdade: Como (e onde) o software livre inclui as pessoas
Semeando Liberdade: Como (e onde) o software livre inclui as pessoasSemeando Liberdade: Como (e onde) o software livre inclui as pessoas
Semeando Liberdade: Como (e onde) o software livre inclui as pessoas
 
O que é programação de computadores
O que é programação de computadoresO que é programação de computadores
O que é programação de computadores
 
Economia em rede (comunidade)
Economia em rede (comunidade)Economia em rede (comunidade)
Economia em rede (comunidade)
 
Aplicações Corporativas em PHP (CRM e ERP)
Aplicações Corporativas em PHP (CRM e ERP)Aplicações Corporativas em PHP (CRM e ERP)
Aplicações Corporativas em PHP (CRM e ERP)
 

Gerenciando aspectos e eventos com Zend Framework 2

  • 1. Gerenciando Aspectos e Eventos com Zend Framework 2 Flávio Gomes da Silva Lisboa www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 2. Quem sou eu NOVO! Autor Arquiteto e Desenvolvedor Certificado Instrutor www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 3. Especialista em história em quadrinhos http://perse.doneit.com.br romocavaleirodoespaco.blogspot.com www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 4. 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. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 6. 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?
  • 7. Problemas...  Como permitimos a manipulação da ordem na qual plugins, filtros de interceptação, eventos, etc., são disparados.  ...  Como resolver tudo isso?
  • 8. 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
  • 9. Solução: Programação Orientada a Aspectos “Um aspecto é uma característica ligada a muitas partes de um programa” “Um aspecto é um interesse transversal” FGSL
  • 10. 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.
  • 11. Interesses transversais Classe A Classe B Classe C Classe D
  • 12. Reuso limitado em POO ● 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. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 13. Reuso limitado em POO ● 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! www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 14. A Tirania da Decomposição Dominante ● 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 www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 15. Solução: Observador de Sujeitos  Prós  Simples de entender  Interfaces SPL são bem conhecidas (mas limitadas)
  • 16. Solução: Observador de Sujeitos <?php class 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); } }
  • 17. Solução: Observador de Sujeitos <?php public function measureTemperature() { if ($this->temperature > 40) { $this->notify(); } } public function setTemperature($temperature) { $this->temperature = $temperature; } }
  • 18. Solução: Observador de Sujeitos <?php class Fireman implements SplObserver { public function update(Building $subject) { $subject->setTemperature(36); } }
  • 19. 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.
  • 20. 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
  • 21. Solução: Publicador/Sobrescritor de Eventos (PubSub)
  • 22. 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>
  • 23. 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); }); });
  • 24. 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.
  • 25. 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.
  • 26. 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
  • 27. 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.
  • 28. 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.
  • 29. 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.
  • 33. Combinação de Poderes Linka Wheeler Gi Ma-Ti Kwame
  • 34. 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.
  • 35. 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.
  • 36. Como criar class EventManager implements EventManagerInterface use ZendEventManagerEventManager; $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 ZendLoaderStandardAutoloader(); $loader->register();
  • 37. 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);
  • 39. Obrigado www.fgsl.eti.br flavio.lisboa@fgsl.eti.br @fgsl