0
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 M...
Primeiros Passos - Converter vendor prefixos para PHP 5.3 namespaces; - Refactoring exceptions; - Mudança na arquitetura a...
Namespaces
Namespaces - Cada arquivo de classe declara um namespace;  - Um namespace por arquivo; - Qualquer classe que não usa o nam...
Definindo namespace namespace  ZendAcl; class  Acl {} 05 de Novembro de 2011
Namespace CONSTANT namespace  ZendApplication; echo  __NAMESPACE__; 05 de Novembro de 2011
Usando alias use  ZendAcl  as  Acl; $resource =  new  AclResource(); 05 de Novembro de 2011
Importando classes use  ZendAclAcl; $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; - ...
Melhorias - Eliminação da classe Zend_Exception; - Cada componente define marker interface Exception; - Implementa SPL exc...
SPL Exceptions - Hierarquia de Exceptions: Exception LogicException BadFunctionCallException BadMethodCallException Domain...
Arquitetura exceptions namespace  ZendAmf; interface  Exception{} namespace  ZendAmfException; use  ZendAmfException; clas...
Autoloading
Problemas - Muitas classes são carregadas sem necessidade; - Faltando require_once em alguns componentes; Exemplo issue ht...
Melhorias - Retirada as chamadas require_once; - Segue PSR-0;  - PSR = PHP Standards Recomendation  - Libs que seguem está...
ZF1 style autoloading require_once   'Zend/Loader/StandardAutoloader.php' ; $loader =  new  ZendLoaderStandardAutoloader(a...
Por namespace/prefixo autoloading require_once   'Zend/Loader/StandardAutoloader.php' ; $loader =  new  ZendLoaderStandard...
Class-Map autoloading require_once   'Zend/Loader/ClassMapAutoloader.php' ; $loader =  new  ZendLoaderClassMapAutoloader()...
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 estiv...
Module autoloading - Permite carregamento da classe de configuração do módulo; - Scan diretórios dos módulos, permite dire...
Module autoloading require_once   'Zend/Loader/ModuleAutoloader.php' ; $loader =  new  ZendLoaderModuleAutoloader(); $load...
Múltiplos autoloading - ZF1 style - Class-Map autoloading - Namespace/prefix paths - Module autoloading require_once   'Ze...
Plugin loading
Plugins??? - Action e view helpers; - Adapters; - Filter e Validators quando usados com Form (também os decoradores) e Inp...
Problema - Maneiras distintas para resolver dinamicamente as classes de plugin.  - Caminhos relativos à classe chamada; - ...
Como usar - Criar um plugin loader padrão; - Criar um plugin broker padrão; - Compor um corretor em sua classe; - Opcional...
Como usar - Criar um plugin loader padrão; - Criar um plugin broker padrão; - Compor um corretor em sua classe; - Opcional...
Default Plugin Loader ZendLoaderPluginClassLoader; - Container para armazenamento de plugins utilizado em composição com B...
Registrando um plugin $locator =  new  ZendLoaderPluginClassLoader(); $locator->registerPlugin ('gravatar' ,  'ZendViewHel...
Registrando um plugin – Concrete plugin loader namespace  MyViewHelper; use  ZendLoaderPluginClassLoader; class  HelperLoa...
Registrando um plugin – Static Map ZendLoaderPluginClassLoader::addStaticMap( array ( 'gravatar'  =>  'ZendViewHelperGrava...
Registrando um plugin – Map to Map namespace  MyViewHelper; use  ZendLoaderPluginClassLoader; class  HelperLoader  extends...
Locator Precedência - Mapa definidos no gerenciador de plugin de concreto; - Mapas estáticos (registo mais recente tem pre...
Default Plugin Loader ZendLoaderPluginBroker; - Faz carregamento de plugins faz uso por default ZendLoaderPluginClassLoade...
Carregando Plugin $locator =  new  ZendLoaderPluginClassLoader( array ( 'gravatar'   =>  'ZendViewHelperGravatar' )); $bro...
Registrando Plugin – Através do Broker $helper =  new  ZendViewHelperGravatar(); $broker =  new  ZendLoaderPluginBroker();...
Lazy Loading Plugin Broker - Implementa ZendLoaderLazyLoadingBroker; - Classe base ZendLoaderPluginSpecBroker; - Registra ...
Usando Lazy Loading Broker $broker =  new  ZendLoaderPluginSpecBroker(); $broker->registerSpec( 'url' , array($request, $r...
Event Manager
Problema - Como introduzir debug/logging na framework? - Como permitir implementação de cache pelos utilizadores? - Como p...
Solution: AOP - Define vários "aspectos" que podem ser interessantes para observar e / ou anexar  a um consumido...
Requisitos - Razoavelmente fácil de entender; - Permitir a interrupção da execução - Permitir a priorização de manipulador...
Solução: Subject-Observer - Prós - Simples de entender; - Interfaces SPL são bem conhecidas (mas limitadas); - Contras - N...
Solução: PubSub/Events - Prós - Assinar avisos arbitrária; - Paradigma bem conhecido na programação UI (JavaScript). - Con...
Solução: Signal Slots - Prós - Bem conhecido nos círculos de ciência da computação; - Código emite sinais, que são interce...
Solução: Intercepting Filters - Prós - Similar às soluções anteriores, exceto que cada manipulador  recebe a cadeia de fil...
Event Manager Um pouco de cada Subject Observer, Signal Slot, Intercepeting Filter, PubSub  para fornecer uma solução abra...
Event Manager: Primeiros Passos use  ZendEventManagerEventManager; $events =  new  EventManager(); $events->attach( 'event...
Versão Estática de EventManager use  ZendEventManagerStaticEventManager; $events = StaticEventManager::getInstance(); $eve...
Interrompendo Execução $events->attach( 'event' , function($e) { return  10; }); $results = $events->triggerUntil( 'event'...
Dependency Injection
Simples Definição - Define maneiras de passar as dependências a um objeto.  $dependency = new Pessoa(); $user  = new User(...
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  ZendDiDi; $di->instance...
ZendDiDefinition Definições são o lugar onde ZendDi tenta compreender a estrutura do código.  Significa que se você escrev...
ZendDiDefinition Definições é o lugar onde ZendDi tenta compreender a estrutura do código.  05 de Novembro de 2011
ZendDiDefinition Runtime - Utilizado por default, com DefinitionList (lista encadeada); - Definição por reflexão; 05 de No...
ZendDiDefinition Compiler - Similar ao Runtime com exceção pode ser salvo em disco; 05 de Novembro de 2011
ZendDiDefinition Class - Através de classe ou definição de sua classe completa com um xml.  (arquivo de configuração) 05 d...
Obrigado!!!
Upcoming SlideShare
Loading in...5
×

Phprio

703

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
703
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
12
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "Phprio"

  1. 1. Patterns
  2. 2. ZF2 Patterns Ramon Henrique Ornelas Twitter: @ramonornela Github: http://github.com/ramonornela 05 de Novembro de 2011
  3. 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. 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
  5. 5. Namespaces
  6. 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. 7. Definindo namespace namespace ZendAcl; class Acl {} 05 de Novembro de 2011
  8. 8. Namespace CONSTANT namespace ZendApplication; echo __NAMESPACE__; 05 de Novembro de 2011
  9. 9. Usando alias use ZendAcl as Acl; $resource = new AclResource(); 05 de Novembro de 2011
  10. 10. Importando classes use ZendAclAcl; $acl = new Acl(); 05 de Novembro de 2011
  11. 11. Exceptions
  12. 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. 13. Melhorias - Eliminação da classe Zend_Exception; - Cada componente define marker interface Exception; - Implementa SPL exceptions. 05 de Novembro de 2011
  14. 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. 15. Arquitetura exceptions namespace ZendAmf; interface Exception{} namespace ZendAmfException; use ZendAmfException; class InvalidArgumentException extends InvalidArgumentException i mplements Exception {} 05 de Novembro de 2011
  16. 16. Autoloading
  17. 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. 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. 19. ZF1 style autoloading require_once 'Zend/Loader/StandardAutoloader.php' ; $loader = new ZendLoaderStandardAutoloader(array( 'fallback_autoloader' => true)); $loader->register(); 05 de Novembro de 2011
  20. 20. Por namespace/prefixo autoloading require_once 'Zend/Loader/StandardAutoloader.php' ; $loader = new ZendLoaderStandardAutoloader(); $loader->registerPrefix( 'My' , __DIR__ . '/My' ); // My $loader->registerNamespace( 'My' , __DIR__ . '/My' ); // My _ $loader->register(); 05 de Novembro de 2011
  21. 21. Class-Map autoloading require_once 'Zend/Loader/ClassMapAutoloader.php' ; $loader = new ZendLoaderClassMapAutoloader(); $loader->registerAutoloadMap( array ( 'ZendVersion' => 'Zend/Version.php' ) ); $loader->register(); 05 de Novembro de 2011
  22. 22. Gerar autoload_classmap.php bin/classmap_generator.php 05 de Novembro de 2011
  23. 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. 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. 25. Module autoloading require_once 'Zend/Loader/ModuleAutoloader.php' ; $loader = new ZendLoaderModuleAutoloader(); $loader->registerPath(__DIR__ . '/My/Test' , 'Test' ); $loader->register(); $module = new TestModule(); $module->init(); 05 de Novembro de 2011
  26. 26. Múltiplos autoloading - ZF1 style - Class-Map autoloading - Namespace/prefix paths - Module autoloading require_once 'Zend/Loader/AutoloaderFactory.php' ; $loader = ZendLoaderAutoloaderFactory::factory( array ( 'ZendLoaderClassMapAutoloader' => array ( array ( 'ZendVersion' => 'library/Zend/Version.php' ) ), 'ZendLoaderStandardAutoloader' => array( 'namespaces' => array ( 'My' => __DIR__ . '/My' ), 'prefixes' => array ( 'My' => __DIR__ . '/My' ), ), ) ); 05 de Novembro de 2011
  27. 27. Plugin loading
  28. 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. 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. 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. 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. 32. Default Plugin Loader ZendLoaderPluginClassLoader; - Container para armazenamento de plugins utilizado em composição com Broker. 05 de Novembro de 2011
  33. 33. Registrando um plugin $locator = new ZendLoaderPluginClassLoader(); $locator->registerPlugin ('gravatar' , 'ZendViewHelperGravatar' ); $locator->load( 'gravatar' ); 05 de Novembro de 2011
  34. 34. Registrando um plugin – Concrete plugin loader namespace MyViewHelper; use ZendLoaderPluginClassLoader; class HelperLoader extends PluginClassLoader { protected $plugins = array ( 'gravatar' => 'ZendViewHelperGravatar' ); } $helperLoader = new HelperLoader(); $helperLoader->load( 'gravatar' ); 05 de Novembro de 2011
  35. 35. Registrando um plugin – Static Map ZendLoaderPluginClassLoader::addStaticMap( array ( 'gravatar' => 'ZendViewHelperGravatar' )); $locator = new ZendLoaderPluginClassLoader(); $locator->load( 'gravatar' ); 05 de Novembro de 2011
  36. 36. Registrando um plugin – Map to Map namespace MyViewHelper; use ZendLoaderPluginClassLoader; class HelperLoader extends PluginClassLoader { protected $plugins = array ( 'gravatar' => 'ZendViewHelperGravatar' ); } $helperLoader = new HelperLoader(); $locator = new ZendLoaderPluginClassLoader($helperLoader); $helperLoader->load( 'gravatar' ); 05 de Novembro de 2011
  37. 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. 38. Default Plugin Loader ZendLoaderPluginBroker; - Faz carregamento de plugins faz uso por default ZendLoaderPluginClassLoader. 05 de Novembro de 2011
  39. 39. Carregando Plugin $locator = new ZendLoaderPluginClassLoader( array ( 'gravatar' => 'ZendViewHelperGravatar' )); $broker = new ZendLoaderPluginBroker(array( 'class_loader' => $locator )); $broker->load( 'gravatar' ); 05 de Novembro de 2011
  40. 40. Registrando Plugin – Através do Broker $helper = new ZendViewHelperGravatar(); $broker = new ZendLoaderPluginBroker(); $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. 41. Lazy Loading Plugin Broker - Implementa ZendLoaderLazyLoadingBroker; - Classe base ZendLoaderPluginSpecBroker; - 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. 42. Usando Lazy Loading Broker $broker = new ZendLoaderPluginSpecBroker(); $broker->registerSpec( 'url' , array($request, $response)); $broker->load( 'url' ); 05 de Novembro de 2011
  43. 43. Event Manager
  44. 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. 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. 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. 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. 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. 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. 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. 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. 52. Event Manager: Primeiros Passos use ZendEventManagerEventManager; $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. 53. Versão Estática de EventManager use ZendEventManagerStaticEventManager; $events = StaticEventManager::getInstance(); $events->attach( 'Id' , 'event' , function($e) { echo'Target:' , $target = get_class($e->getTarget()); “Id” }); ZendEventManagerStaticEventManager; 05 de Novembro de 2011
  54. 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
  55. 55. Dependency Injection
  56. 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. 57. Di vs DiC - Di é um pattern; - Dic é uma ferramenta; 05 de Novembro de 2011
  58. 58. Usando Di class AliasOrClass { public function __construct($name) { echo $name; } } $di = new ZendDiDi; $di->instanceManager()->setParameters( 'AliasOrClass' , array( 'name' => 'Ramon' )); 05 de Novembro de 2011
  59. 59. ZendDiDefinition Definições são o lugar onde ZendDi tenta compreender a estrutura do código. Significa que se você escreveu não-ambígua de código, claro e conciso; ZendDi tem uma chance muito boa de entender como as coisas. 05 de Novembro de 2011
  60. 60. ZendDiDefinition Definições é o lugar onde ZendDi tenta compreender a estrutura do código. 05 de Novembro de 2011
  61. 61. ZendDiDefinition Runtime - Utilizado por default, com DefinitionList (lista encadeada); - Definição por reflexão; 05 de Novembro de 2011
  62. 62. ZendDiDefinition Compiler - Similar ao Runtime com exceção pode ser salvo em disco; 05 de Novembro de 2011
  63. 63. ZendDiDefinition Class - Através de classe ou definição de sua classe completa com um xml. (arquivo de configuração) 05 de Novembro de 2011
  64. 64. Obrigado!!!
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×