SlideShare uma empresa Scribd logo
Patterns
ZF2 Patterns Ramon Henrique Ornelas Twitter: @ramonornela Github: http://github.com/ramonornela 05 de Novembro de 2011
Inicio dos Trabalhos   -  Agosto de 2010:  Primeiro milestone publicado release-2.0.0dev1;  - Agosto de 2011:   Primeiro Meeting quinzenal; - Outubro de 2011:  Primeiro release beta  release-2.0.0beta1; 05 de Novembro de 2011
Primeiros Passos - Converter vendor prefixos para PHP 5.3 namespaces; - Refactoring exceptions; - Mudança na arquitetura autoload e melhorias plugin loading; 05 de Novembro de 2011
Namespaces
Namespaces - Cada arquivo de classe declara um namespace;  - Um namespace por arquivo; - Qualquer classe que não usa o namespace atual  (ou subnamespace) é importado e, normalmente, alias;  - Resolução Global é desencorajada, exceto no caso de classes referenciadas  em strings. 05 de Novembro de 2011
Definindo namespace namespace  Zend\Acl; class  Acl {} 05 de Novembro de 2011
Namespace CONSTANT namespace  Zend\Application; echo  __NAMESPACE__; 05 de Novembro de 2011
Usando alias use  Zend\Acl  as  Acl; $resource =  new  Acl\Resource(); 05 de Novembro de 2011
Importando classes use  Zend\Acl\Acl; $acl =  new  Acl(); 05 de Novembro de 2011
Exceptions
Problemas - Não estende tipo de exceção semântica oferecidos pela SPL; - Todas as exceções derivam de uma única classe; - Dependência difícil. 05 de Novembro de 2011
Melhorias - Eliminação da classe Zend_Exception; - Cada componente define marker interface Exception; - Implementa SPL exceptions. 05 de Novembro de 2011
SPL Exceptions - Hierarquia de Exceptions: Exception LogicException BadFunctionCallException BadMethodCallException DomainException InvalidArgumentException LengthException OutOfRangeException RuntimeException OutOfBoundsException OverflowException RangeException UnderflowException UnexpectedValueException 05 de Novembro de 2011
Arquitetura exceptions namespace  Zend\Amf; interface  Exception{} namespace  Zend\Amf\Exception; use  Zend\Amf\Exception; class   InvalidArgumentException  extends  \ InvalidArgumentException i mplements  Exception {} 05 de Novembro de 2011
Autoloading
Problemas - Muitas classes são carregadas sem necessidade; - Faltando require_once em alguns componentes; Exemplo issue http://framework.zend.com/issues/browse/ZF-10291 05 de Novembro de 2011
Melhorias - Retirada as chamadas require_once; - Segue PSR-0;  - PSR = PHP Standards Recomendation  - Libs que seguem está recomendação:  Symfony, Doctrine, Zend Framework, PEAR2/Pyrus, Lithium, Agavi, etc. - Com isto permitirá carregar classes de 1 ou mais bibliotecas diferentes com um  único autoloader e um único include path; - SplClassLoader! http://gist.github.com/221634 virá na versão 5.4 \o/. - Oferece múltiplas abordagens - ZF1 style; - Por namespace/vendor prefixo (convenção de nomenclatura ZF1) autoloading; - Class Map autoloading; - Module autoloading; 05 de Novembro de 2011
ZF1 style autoloading require_once   'Zend/Loader/StandardAutoloader.php' ; $loader =  new  Zend\Loader\StandardAutoloader(array( 'fallback_autoloader'  => true)); $loader->register(); 05 de Novembro de 2011
Por namespace/prefixo autoloading require_once   'Zend/Loader/StandardAutoloader.php' ; $loader =  new  Zend\Loader\StandardAutoloader(); $loader->registerPrefix( 'My' , __DIR__ .  '/My' );  // My\ $loader->registerNamespace( 'My' , __DIR__ .  '/My' );  // My _ $loader->register(); 05 de Novembro de 2011
Class-Map autoloading require_once   'Zend/Loader/ClassMapAutoloader.php' ; $loader =  new  Zend\Loader\ClassMapAutoloader(); $loader->registerAutoloadMap( array ( 'Zend\Version'  =>  'Zend/Version.php' ) ); $loader->register(); 05 de Novembro de 2011
Gerar autoload_classmap.php bin/classmap_generator.php 05 de Novembro de 2011
Performance Class-Map mostram uma melhora de 25% sobre o autoloader ZF1 sem aceleração. - E melhorias 60-85%, quando estiver no cache opcode. Namespaces / prefixos com caminhos específicos mostra ganhos de 10%  sem aceleração. - E 40% quando melhorias de cache opcode. 05 de Novembro de 2011
Module autoloading - Permite carregamento da classe de configuração do módulo; - Scan diretórios dos módulos, permite diretórios compactados (tar, zip, e phar). 05 de Novembro de 2011
Module autoloading require_once   'Zend/Loader/ModuleAutoloader.php' ; $loader =  new  Zend\Loader\ModuleAutoloader(); $loader->registerPath(__DIR__ .   '/My/Test' ,  'Test' ); $loader->register(); $module = new Test\Module(); $module->init(); 05 de Novembro de 2011
Múltiplos autoloading - ZF1 style - Class-Map autoloading - Namespace/prefix paths - Module autoloading require_once   'Zend/Loader/AutoloaderFactory.php' ; $loader = Zend\Loader\AutoloaderFactory::factory( array ( 'Zend\Loader\ClassMapAutoloader'  =>  array ( array ( 'Zend\Version'  =>  'library/Zend/Version.php' ) ), 'Zend\Loader\StandardAutoloader'  => array( 'namespaces' =>  array ( 'My'  => __DIR__ .  '/My' ), 'prefixes'  =>  array ( 'My'  => __DIR__ .  '/My' ), ), ) ); 05 de Novembro de 2011
Plugin loading
Plugins??? - Action e view helpers; - Adapters; - Filter e Validators quando usados com Form (também os decoradores) e InputFilter . 05 de Novembro de 2011
Problema - Maneiras distintas para resolver dinamicamente as classes de plugin.  - Caminhos relativos à classe chamada; - Caminho caminho-pilhas (mais comum); - Setters to indicate as classes; - Abordagem comum é a pior; - Mau desempenho (performance); - Difícil depuração; 05 de Novembro de 2011
Como usar - Criar um plugin loader padrão; - Criar um plugin broker padrão; - Compor um corretor em sua classe; - Opcionalmente pode ser definida uma configuração estática; - Opcionalmente atribuir um broker e loader configuração. 05 de Novembro de 2011
Como usar - Criar um plugin loader padrão; - Criar um plugin broker padrão; - Compor um corretor em sua classe; - Opcionalmente pode ser definida uma configuração estática; - Opcionalmente atribuir um broker e loader configuração. 05 de Novembro de 2011
Default Plugin Loader Zend\Loader\PluginClassLoader; - Container para armazenamento de plugins utilizado em composição com Broker. 05 de Novembro de 2011
Registrando um plugin $locator =  new  Zend\Loader\PluginClassLoader(); $locator->registerPlugin ('gravatar' ,  'Zend\View\Helper\Gravatar' ); $locator->load( 'gravatar' ); 05 de Novembro de 2011
Registrando um plugin – Concrete plugin loader namespace  My\View\Helper; use  Zend\Loader\PluginClassLoader; class  HelperLoader  extends  PluginClassLoader { protected  $plugins =  array ( 'gravatar'   =>  'Zend\View\Helper\Gravatar' ); } $helperLoader =  new  HelperLoader(); $helperLoader->load( 'gravatar' ); 05 de Novembro de 2011
Registrando um plugin – Static Map Zend\Loader\PluginClassLoader::addStaticMap( array ( 'gravatar'  =>  'Zend\View\Helper\Gravatar' )); $locator =  new  Zend\Loader\PluginClassLoader(); $locator->load( 'gravatar' ); 05 de Novembro de 2011
Registrando um plugin – Map to Map namespace  My\View\Helper; use  Zend\Loader\PluginClassLoader; class  HelperLoader  extends  PluginClassLoader { protected  $plugins =  array ( 'gravatar'   =>  'Zend\View\Helper\Gravatar' ); } $helperLoader =  new  HelperLoader(); $locator  =  new  \Zend\Loader\PluginClassLoader($helperLoader); $helperLoader->load( 'gravatar' ); 05 de Novembro de 2011
Locator Precedência - Mapa definidos no gerenciador de plugin de concreto; - Mapas estáticos (registo mais recente tem precedência); - Mapeamento passados ​​na instância; - Mapeamento explícito. 05 de Novembro de 2011
Default Plugin Loader Zend\Loader\PluginBroker; - Faz carregamento de plugins faz uso por default Zend\Loader\PluginClassLoader. 05 de Novembro de 2011
Carregando Plugin $locator =  new  Zend\Loader\PluginClassLoader( array ( 'gravatar'   =>  'Zend\View\Helper\Gravatar' )); $broker =  new  Zend\Loader\PluginBroker(array( 'class_loader'  => $locator )); $broker->load( 'gravatar' ); 05 de Novembro de 2011
Registrando Plugin – Através do Broker $helper =  new  Zend\View\Helper\Gravatar(); $broker =  new  Zend\Loader\PluginBroker(); $broker->register( 'gravatar' , $helper); $broker->load( 'gravatar '); - Opcionalmente ao registar o plugin é feita uma validação (exemplo instanceof)  registrada através do método validatePlugin() definindo um callback. - Opcionalmente registra plugins; 05 de Novembro de 2011
Lazy Loading Plugin Broker - Implementa Zend\Loader\LazyLoadingBroker; - Classe base Zend\Loader\PluginSpecBroker; - Registra “specs” para o broker; - Quando esse plugin é solicitado, as opções fornecidas serão usadas  a menos que novas opções sejam fornecidas.  05 de Novembro de 2011
Usando Lazy Loading Broker $broker =  new  Zend\Loader\PluginSpecBroker(); $broker->registerSpec( 'url' , array($request, $response)); $broker->load( 'url' ); 05 de Novembro de 2011
Event Manager
Problema - Como introduzir debug/logging na framework? - Como permitir implementação de cache pelos utilizadores? - Como permitir utilizadores introduzir filtros e validações? 05 de Novembro de 2011
Solution: AOP - Define vários "aspectos" que podem ser interessantes para observar e / ou anexar  a um consumidor  05 de Novembro de 2011
Requisitos - Razoavelmente fácil de entender; - Permitir a interrupção da execução - Permitir a priorização de manipuladores; - Previsibilidade de argumentos passados ​​para manipuladores; - Capacidade para anexar ao evento muitos componentes de emissão de uma só vez.  05 de Novembro de 2011
Solução: Subject-Observer - Prós - Simples de entender; - Interfaces SPL são bem conhecidas (mas limitadas); - Contras - Normalmente, não pode interromper a execução de observadores restantes; - Requer um sistema para cada componente e / ou classe; - Normalmente, não tem capacidade de priorizar manipuladores.  05 de Novembro de 2011
Solução: PubSub/Events - Prós - Assinar avisos arbitrária; - Paradigma bem conhecido na programação UI (JavaScript). - Contras - Muitas vezes, necessidade de testar o evento proporcionou para garantir que  você pode lidar com isso; - Geralmente, não há capacidade de priorizar manipuladores.  05 de Novembro de 2011
Solução: Signal Slots - Prós - Bem conhecido nos círculos de ciência da computação; - Código emite sinais, que são interceptadas por slots; -  Normalmente, composto de um gerente de sinal em uma classe, mas pode  se integrar com um gerente global, bem - Geralmente tem algumas habilidades para priorizar manipuladores; - Contras - Palavreado não é bem conhecido entre os desenvolvedores de PHP; - Argumentos irá variar entre os sinais; -  Problemas de uso de composição por classe e estáticos  como visto em sistema de eventos. 05 de Novembro de 2011
Solução: Intercepting Filters - Prós - Similar às soluções anteriores, exceto que cada manipulador  recebe a cadeia de filtro como argumento, e é responsável por chamar o  seguinte na cadeia. -  Muitas vezes, o "trabalho" inteiro de um método é simplesmente um filtro - Dependendo do design, pode permitir o acesso estático/global - Contras - Às vezes, difícil de realizar fluxos de trabalho complexos; - Mesmo com problemas de uso de composição por classe e  estáticos como visto em sistemas de evento; - Fácil de se esqueça de invocar próximo filtro na cadeia; - Normalmente, a capacidade de não priorizar os filtros. 05 de Novembro de 2011
Event Manager Um pouco de cada Subject Observer, Signal Slot, Intercepeting Filter, PubSub  para fornecer uma solução abrangente. 05 de Novembro de 2011
Event Manager: Primeiros Passos use  Zend\EventManager\EventManager; $events =  new  EventManager(); $events->attach( 'event' , function($e) { $event  = $e->getName(); $params = $e->getParams(); printf( 'Evento "%s", parametros %s' , $event, json_encode($params) ); }); $params = array( 'conference'  =>  'phprio' ); $events->trigger( 'event' , null, $params); 05 de Novembro de 2011
Versão Estática de EventManager use  Zend\EventManager\StaticEventManager; $events = StaticEventManager::getInstance(); $events->attach( 'Id' ,  'event' , function($e) { echo'Target:' , $target = get_class($e->getTarget()); “Id” }); Zend\EventManager\StaticEventManager; 05 de Novembro de 2011
Interrompendo Execução $events->attach( 'event' , function($e) { return  10; }); $results = $events->triggerUntil( 'event' , null, array(), function($result) { var_dump($result); return true ; }); var_dump($results); 05 de Novembro de 2011
Dependency Injection
Simples Definição - Define maneiras de passar as dependências a um objeto.  $dependency = new Pessoa(); $user  = new User($dependency); 05 de Novembro de 2011
Di vs DiC - Di  é um pattern; - Dic é uma ferramenta; 05 de Novembro de 2011
Usando Di class  AliasOrClass { public function  __construct($name) { echo  $name; } } $di =  new  Zend\Di\Di; $di->instanceManager()->setParameters( 'AliasOrClass' , array( 'name'  =>  'Ramon' )); 05 de Novembro de 2011
Zend\Di\Definition Definições são o lugar onde Zend\Di tenta compreender a estrutura do código.  Significa que se você escreveu não-ambígua de código, claro e conciso;  Zend\Di tem uma chance muito boa de entender como as coisas. 05 de Novembro de 2011
Zend\Di\Definition Definições é o lugar onde Zend\Di tenta compreender a estrutura do código.  05 de Novembro de 2011
Zend\Di\Definition Runtime - Utilizado por default, com DefinitionList (lista encadeada); - Definição por reflexão; 05 de Novembro de 2011
Zend\Di\Definition Compiler - Similar ao Runtime com exceção pode ser salvo em disco; 05 de Novembro de 2011
Zend\Di\Definition Class - Através de classe ou definição de sua classe completa com um xml.  (arquivo de configuração) 05 de Novembro de 2011
Obrigado!!!

Mais conteúdo relacionado

PPTX
Meet up teste api htt-party cucumber
PDF
Flame Graphs, uma (boa) alternativa para profiling de apps Java
PDF
PDF
PHP Experience 2016 - [Palestra] Keynote: PHP-7
PPTX
Funções PHP - Criação de sites II
PDF
Zend Framework 2 - Desenvolvimento Ágil Competente
PDF
PHP Experience 2016 - [Palestra] Rumo à Certificação PHP
Meet up teste api htt-party cucumber
Flame Graphs, uma (boa) alternativa para profiling de apps Java
PHP Experience 2016 - [Palestra] Keynote: PHP-7
Funções PHP - Criação de sites II
Zend Framework 2 - Desenvolvimento Ágil Competente
PHP Experience 2016 - [Palestra] Rumo à Certificação PHP

Mais procurados (18)

PDF
Api usando Silex
KEY
Python 08
PDF
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPy
KEY
Plack
PPTX
Laravel 5: Entenda o ambiente e a estrutura MVC
ODP
Selenium Workshop
PDF
PHP Jedi - Boas Práticas e Alta Performance
PDF
Web Offline
PPT
Python cherrypy
PDF
Da Argila Ao Forte - Como desenvolver uma loja virtual
PDF
PHP - Funções
ODP
Php 07 Cakephp
PDF
Servidor de Aplicação Web: CherryPy - Python
PDF
Doctrine2 Seminário PHP
ODP
servlet-requisicoes
PDF
PHP 5.3 - Funções
PDF
Django Módulo Básico Parte II
PPT
Python e Django
Api usando Silex
Python 08
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPy
Plack
Laravel 5: Entenda o ambiente e a estrutura MVC
Selenium Workshop
PHP Jedi - Boas Práticas e Alta Performance
Web Offline
Python cherrypy
Da Argila Ao Forte - Como desenvolver uma loja virtual
PHP - Funções
Php 07 Cakephp
Servidor de Aplicação Web: CherryPy - Python
Doctrine2 Seminário PHP
servlet-requisicoes
PHP 5.3 - Funções
Django Módulo Básico Parte II
Python e Django
Anúncio

Destaque (20)

PPTX
От бизнес-систем к информационным системам: переход шаг за шагом
PDF
5η διάλεξη Γραμμικής Άλγβερας
PPT
PPTX
Sessão de Abertura: Presidente da CIDAADS - Manuel Carvalho Gomes
PPTX
Painel I - Ambiente e Sustentabilidade. Viver a Cidadania na Sustentabilidade...
PPTX
Diseño industrial
PPTX
Diapositivas estadistica.
PDF
Ensayo Anual N°7 De Psu MatemáTica 2009
PDF
Phan tam hoc nhap mon sigmund freud - vy
PPS
SIR ISAAC NEWTON PRINCIPIO DO VAZIO
PPT
Maestro
PPTX
API REST de Geoservicios de Esri y los Servicios estándar OGC Clásicos - JIID...
PDF
Lp22 p1 2011
PDF
Apostila iv conferência infatojuvenil pelo meio ambiente
PPT
Chuong 03 he_thong_file
DOCX
Lusiadas Cruzeiros
PDF
Visual Analytics con Esri y SAP
PPTX
Avisos de deus
ODP
みるみらができるまで2
От бизнес-систем к информационным системам: переход шаг за шагом
5η διάλεξη Γραμμικής Άλγβερας
Sessão de Abertura: Presidente da CIDAADS - Manuel Carvalho Gomes
Painel I - Ambiente e Sustentabilidade. Viver a Cidadania na Sustentabilidade...
Diseño industrial
Diapositivas estadistica.
Ensayo Anual N°7 De Psu MatemáTica 2009
Phan tam hoc nhap mon sigmund freud - vy
SIR ISAAC NEWTON PRINCIPIO DO VAZIO
Maestro
API REST de Geoservicios de Esri y los Servicios estándar OGC Clásicos - JIID...
Lp22 p1 2011
Apostila iv conferência infatojuvenil pelo meio ambiente
Chuong 03 he_thong_file
Lusiadas Cruzeiros
Visual Analytics con Esri y SAP
Avisos de deus
みるみらができるまで2
Anúncio

Semelhante a Phprio (20)

PPT
PHP FrameWARks - FISL
PDF
O que esperar do Zend Framework 2
PDF
Zend Framework
PPTX
ODP
Puppet – Torne Seu Datacenter áGil
PDF
Criando sites com Wordpress
PPT
Php FrameWARks - sem CakePHP
PDF
Otimizando aplicações Zend Framework - Tchelinux
PPT
Testes Automatizados em Ruby on Rails
PPT
Cakephp - framework de desenvolvimento de aplicações Web em PHP
ODP
Estrutura do Projeto
ODP
Estrutura do Projeto
PDF
RubyConfBr 2015 - Rails & Javascript: faça isso direito
ODP
Mini-curso RubyOnRails CESOL
PDF
Programando para programadores: Desafios na evolução de um Framework
PDF
Resolvendo problemas de dependências com o Bundler
PDF
Resolvendo problemas com o Bbundler
PPT
Minicurso Play Framework - Tão fácil que nem parece Java
ODP
Zend Framework
PDF
Zephir
PHP FrameWARks - FISL
O que esperar do Zend Framework 2
Zend Framework
Puppet – Torne Seu Datacenter áGil
Criando sites com Wordpress
Php FrameWARks - sem CakePHP
Otimizando aplicações Zend Framework - Tchelinux
Testes Automatizados em Ruby on Rails
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Estrutura do Projeto
Estrutura do Projeto
RubyConfBr 2015 - Rails & Javascript: faça isso direito
Mini-curso RubyOnRails CESOL
Programando para programadores: Desafios na evolução de um Framework
Resolvendo problemas de dependências com o Bundler
Resolvendo problemas com o Bbundler
Minicurso Play Framework - Tão fácil que nem parece Java
Zend Framework
Zephir

Phprio

  • 2. ZF2 Patterns Ramon Henrique Ornelas Twitter: @ramonornela Github: http://github.com/ramonornela 05 de Novembro de 2011
  • 3. Inicio dos Trabalhos - Agosto de 2010: Primeiro milestone publicado release-2.0.0dev1; - Agosto de 2011: Primeiro Meeting quinzenal; - Outubro de 2011: Primeiro release beta release-2.0.0beta1; 05 de Novembro de 2011
  • 4. Primeiros Passos - Converter vendor prefixos para PHP 5.3 namespaces; - Refactoring exceptions; - Mudança na arquitetura autoload e melhorias plugin loading; 05 de Novembro de 2011
  • 6. Namespaces - Cada arquivo de classe declara um namespace; - Um namespace por arquivo; - Qualquer classe que não usa o namespace atual (ou subnamespace) é importado e, normalmente, alias; - Resolução Global é desencorajada, exceto no caso de classes referenciadas em strings. 05 de Novembro de 2011
  • 7. Definindo namespace namespace Zend\Acl; class Acl {} 05 de Novembro de 2011
  • 8. Namespace CONSTANT namespace Zend\Application; echo __NAMESPACE__; 05 de Novembro de 2011
  • 9. Usando alias use Zend\Acl as Acl; $resource = new Acl\Resource(); 05 de Novembro de 2011
  • 10. Importando classes use Zend\Acl\Acl; $acl = new Acl(); 05 de Novembro de 2011
  • 12. Problemas - Não estende tipo de exceção semântica oferecidos pela SPL; - Todas as exceções derivam de uma única classe; - Dependência difícil. 05 de Novembro de 2011
  • 13. Melhorias - Eliminação da classe Zend_Exception; - Cada componente define marker interface Exception; - Implementa SPL exceptions. 05 de Novembro de 2011
  • 14. SPL Exceptions - Hierarquia de Exceptions: Exception LogicException BadFunctionCallException BadMethodCallException DomainException InvalidArgumentException LengthException OutOfRangeException RuntimeException OutOfBoundsException OverflowException RangeException UnderflowException UnexpectedValueException 05 de Novembro de 2011
  • 15. Arquitetura exceptions namespace Zend\Amf; interface Exception{} namespace Zend\Amf\Exception; use Zend\Amf\Exception; class InvalidArgumentException extends \ InvalidArgumentException i mplements Exception {} 05 de Novembro de 2011
  • 17. Problemas - Muitas classes são carregadas sem necessidade; - Faltando require_once em alguns componentes; Exemplo issue http://framework.zend.com/issues/browse/ZF-10291 05 de Novembro de 2011
  • 18. Melhorias - Retirada as chamadas require_once; - Segue PSR-0; - PSR = PHP Standards Recomendation - Libs que seguem está recomendação: Symfony, Doctrine, Zend Framework, PEAR2/Pyrus, Lithium, Agavi, etc. - Com isto permitirá carregar classes de 1 ou mais bibliotecas diferentes com um único autoloader e um único include path; - SplClassLoader! http://gist.github.com/221634 virá na versão 5.4 \o/. - Oferece múltiplas abordagens - ZF1 style; - Por namespace/vendor prefixo (convenção de nomenclatura ZF1) autoloading; - Class Map autoloading; - Module autoloading; 05 de Novembro de 2011
  • 19. ZF1 style autoloading require_once 'Zend/Loader/StandardAutoloader.php' ; $loader = new Zend\Loader\StandardAutoloader(array( 'fallback_autoloader' => true)); $loader->register(); 05 de Novembro de 2011
  • 20. Por namespace/prefixo autoloading require_once 'Zend/Loader/StandardAutoloader.php' ; $loader = new Zend\Loader\StandardAutoloader(); $loader->registerPrefix( 'My' , __DIR__ . '/My' ); // My\ $loader->registerNamespace( 'My' , __DIR__ . '/My' ); // My _ $loader->register(); 05 de Novembro de 2011
  • 21. Class-Map autoloading require_once 'Zend/Loader/ClassMapAutoloader.php' ; $loader = new Zend\Loader\ClassMapAutoloader(); $loader->registerAutoloadMap( array ( 'Zend\Version' => 'Zend/Version.php' ) ); $loader->register(); 05 de Novembro de 2011
  • 23. Performance Class-Map mostram uma melhora de 25% sobre o autoloader ZF1 sem aceleração. - E melhorias 60-85%, quando estiver no cache opcode. Namespaces / prefixos com caminhos específicos mostra ganhos de 10% sem aceleração. - E 40% quando melhorias de cache opcode. 05 de Novembro de 2011
  • 24. Module autoloading - Permite carregamento da classe de configuração do módulo; - Scan diretórios dos módulos, permite diretórios compactados (tar, zip, e phar). 05 de Novembro de 2011
  • 25. Module autoloading require_once 'Zend/Loader/ModuleAutoloader.php' ; $loader = new Zend\Loader\ModuleAutoloader(); $loader->registerPath(__DIR__ . '/My/Test' , 'Test' ); $loader->register(); $module = new Test\Module(); $module->init(); 05 de Novembro de 2011
  • 26. Múltiplos autoloading - ZF1 style - Class-Map autoloading - Namespace/prefix paths - Module autoloading require_once 'Zend/Loader/AutoloaderFactory.php' ; $loader = Zend\Loader\AutoloaderFactory::factory( array ( 'Zend\Loader\ClassMapAutoloader' => array ( array ( 'Zend\Version' => 'library/Zend/Version.php' ) ), 'Zend\Loader\StandardAutoloader' => array( 'namespaces' => array ( 'My' => __DIR__ . '/My' ), 'prefixes' => array ( 'My' => __DIR__ . '/My' ), ), ) ); 05 de Novembro de 2011
  • 28. Plugins??? - Action e view helpers; - Adapters; - Filter e Validators quando usados com Form (também os decoradores) e InputFilter . 05 de Novembro de 2011
  • 29. Problema - Maneiras distintas para resolver dinamicamente as classes de plugin. - Caminhos relativos à classe chamada; - Caminho caminho-pilhas (mais comum); - Setters to indicate as classes; - Abordagem comum é a pior; - Mau desempenho (performance); - Difícil depuração; 05 de Novembro de 2011
  • 30. Como usar - Criar um plugin loader padrão; - Criar um plugin broker padrão; - Compor um corretor em sua classe; - Opcionalmente pode ser definida uma configuração estática; - Opcionalmente atribuir um broker e loader configuração. 05 de Novembro de 2011
  • 31. Como usar - Criar um plugin loader padrão; - Criar um plugin broker padrão; - Compor um corretor em sua classe; - Opcionalmente pode ser definida uma configuração estática; - Opcionalmente atribuir um broker e loader configuração. 05 de Novembro de 2011
  • 32. Default Plugin Loader Zend\Loader\PluginClassLoader; - Container para armazenamento de plugins utilizado em composição com Broker. 05 de Novembro de 2011
  • 33. Registrando um plugin $locator = new Zend\Loader\PluginClassLoader(); $locator->registerPlugin ('gravatar' , 'Zend\View\Helper\Gravatar' ); $locator->load( 'gravatar' ); 05 de Novembro de 2011
  • 34. Registrando um plugin – Concrete plugin loader namespace My\View\Helper; use Zend\Loader\PluginClassLoader; class HelperLoader extends PluginClassLoader { protected $plugins = array ( 'gravatar' => 'Zend\View\Helper\Gravatar' ); } $helperLoader = new HelperLoader(); $helperLoader->load( 'gravatar' ); 05 de Novembro de 2011
  • 35. Registrando um plugin – Static Map Zend\Loader\PluginClassLoader::addStaticMap( array ( 'gravatar' => 'Zend\View\Helper\Gravatar' )); $locator = new Zend\Loader\PluginClassLoader(); $locator->load( 'gravatar' ); 05 de Novembro de 2011
  • 36. Registrando um plugin – Map to Map namespace My\View\Helper; use Zend\Loader\PluginClassLoader; class HelperLoader extends PluginClassLoader { protected $plugins = array ( 'gravatar' => 'Zend\View\Helper\Gravatar' ); } $helperLoader = new HelperLoader(); $locator = new \Zend\Loader\PluginClassLoader($helperLoader); $helperLoader->load( 'gravatar' ); 05 de Novembro de 2011
  • 37. Locator Precedência - Mapa definidos no gerenciador de plugin de concreto; - Mapas estáticos (registo mais recente tem precedência); - Mapeamento passados ​​na instância; - Mapeamento explícito. 05 de Novembro de 2011
  • 38. Default Plugin Loader Zend\Loader\PluginBroker; - Faz carregamento de plugins faz uso por default Zend\Loader\PluginClassLoader. 05 de Novembro de 2011
  • 39. Carregando Plugin $locator = new Zend\Loader\PluginClassLoader( array ( 'gravatar' => 'Zend\View\Helper\Gravatar' )); $broker = new Zend\Loader\PluginBroker(array( 'class_loader' => $locator )); $broker->load( 'gravatar' ); 05 de Novembro de 2011
  • 40. Registrando Plugin – Através do Broker $helper = new Zend\View\Helper\Gravatar(); $broker = new Zend\Loader\PluginBroker(); $broker->register( 'gravatar' , $helper); $broker->load( 'gravatar '); - Opcionalmente ao registar o plugin é feita uma validação (exemplo instanceof) registrada através do método validatePlugin() definindo um callback. - Opcionalmente registra plugins; 05 de Novembro de 2011
  • 41. Lazy Loading Plugin Broker - Implementa Zend\Loader\LazyLoadingBroker; - Classe base Zend\Loader\PluginSpecBroker; - Registra “specs” para o broker; - Quando esse plugin é solicitado, as opções fornecidas serão usadas a menos que novas opções sejam fornecidas. 05 de Novembro de 2011
  • 42. Usando Lazy Loading Broker $broker = new Zend\Loader\PluginSpecBroker(); $broker->registerSpec( 'url' , array($request, $response)); $broker->load( 'url' ); 05 de Novembro de 2011
  • 44. Problema - Como introduzir debug/logging na framework? - Como permitir implementação de cache pelos utilizadores? - Como permitir utilizadores introduzir filtros e validações? 05 de Novembro de 2011
  • 45. Solution: AOP - Define vários "aspectos" que podem ser interessantes para observar e / ou anexar a um consumidor 05 de Novembro de 2011
  • 46. Requisitos - Razoavelmente fácil de entender; - Permitir a interrupção da execução - Permitir a priorização de manipuladores; - Previsibilidade de argumentos passados ​​para manipuladores; - Capacidade para anexar ao evento muitos componentes de emissão de uma só vez. 05 de Novembro de 2011
  • 47. Solução: Subject-Observer - Prós - Simples de entender; - Interfaces SPL são bem conhecidas (mas limitadas); - Contras - Normalmente, não pode interromper a execução de observadores restantes; - Requer um sistema para cada componente e / ou classe; - Normalmente, não tem capacidade de priorizar manipuladores. 05 de Novembro de 2011
  • 48. Solução: PubSub/Events - Prós - Assinar avisos arbitrária; - Paradigma bem conhecido na programação UI (JavaScript). - Contras - Muitas vezes, necessidade de testar o evento proporcionou para garantir que você pode lidar com isso; - Geralmente, não há capacidade de priorizar manipuladores. 05 de Novembro de 2011
  • 49. Solução: Signal Slots - Prós - Bem conhecido nos círculos de ciência da computação; - Código emite sinais, que são interceptadas por slots; - Normalmente, composto de um gerente de sinal em uma classe, mas pode se integrar com um gerente global, bem - Geralmente tem algumas habilidades para priorizar manipuladores; - Contras - Palavreado não é bem conhecido entre os desenvolvedores de PHP; - Argumentos irá variar entre os sinais; - Problemas de uso de composição por classe e estáticos como visto em sistema de eventos. 05 de Novembro de 2011
  • 50. Solução: Intercepting Filters - Prós - Similar às soluções anteriores, exceto que cada manipulador recebe a cadeia de filtro como argumento, e é responsável por chamar o seguinte na cadeia. - Muitas vezes, o "trabalho" inteiro de um método é simplesmente um filtro - Dependendo do design, pode permitir o acesso estático/global - Contras - Às vezes, difícil de realizar fluxos de trabalho complexos; - Mesmo com problemas de uso de composição por classe e estáticos como visto em sistemas de evento; - Fácil de se esqueça de invocar próximo filtro na cadeia; - Normalmente, a capacidade de não priorizar os filtros. 05 de Novembro de 2011
  • 51. Event Manager Um pouco de cada Subject Observer, Signal Slot, Intercepeting Filter, PubSub para fornecer uma solução abrangente. 05 de Novembro de 2011
  • 52. Event Manager: Primeiros Passos use Zend\EventManager\EventManager; $events = new EventManager(); $events->attach( 'event' , function($e) { $event = $e->getName(); $params = $e->getParams(); printf( 'Evento "%s", parametros %s' , $event, json_encode($params) ); }); $params = array( 'conference' => 'phprio' ); $events->trigger( 'event' , null, $params); 05 de Novembro de 2011
  • 53. Versão Estática de EventManager use Zend\EventManager\StaticEventManager; $events = StaticEventManager::getInstance(); $events->attach( 'Id' , 'event' , function($e) { echo'Target:' , $target = get_class($e->getTarget()); “Id” }); Zend\EventManager\StaticEventManager; 05 de Novembro de 2011
  • 54. Interrompendo Execução $events->attach( 'event' , function($e) { return 10; }); $results = $events->triggerUntil( 'event' , null, array(), function($result) { var_dump($result); return true ; }); var_dump($results); 05 de Novembro de 2011
  • 56. Simples Definição - Define maneiras de passar as dependências a um objeto. $dependency = new Pessoa(); $user = new User($dependency); 05 de Novembro de 2011
  • 57. Di vs DiC - Di é um pattern; - Dic é uma ferramenta; 05 de Novembro de 2011
  • 58. Usando Di class AliasOrClass { public function __construct($name) { echo $name; } } $di = new Zend\Di\Di; $di->instanceManager()->setParameters( 'AliasOrClass' , array( 'name' => 'Ramon' )); 05 de Novembro de 2011
  • 59. Zend\Di\Definition Definições são o lugar onde Zend\Di tenta compreender a estrutura do código. Significa que se você escreveu não-ambígua de código, claro e conciso; Zend\Di tem uma chance muito boa de entender como as coisas. 05 de Novembro de 2011
  • 60. Zend\Di\Definition Definições é o lugar onde Zend\Di tenta compreender a estrutura do código. 05 de Novembro de 2011
  • 61. Zend\Di\Definition Runtime - Utilizado por default, com DefinitionList (lista encadeada); - Definição por reflexão; 05 de Novembro de 2011
  • 62. Zend\Di\Definition Compiler - Similar ao Runtime com exceção pode ser salvo em disco; 05 de Novembro de 2011
  • 63. Zend\Di\Definition Class - Através de classe ou definição de sua classe completa com um xml. (arquivo de configuração) 05 de Novembro de 2011