pilares do zend framework 2

67
Os Pilares do Zend Framework 2 Construindo Aplicações Realmente Modulares @Pauloelr

Upload: paulo-eduardo-rezende

Post on 10-Jan-2017

175 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Pilares do Zend Framework 2

Os Pilares do Zend Framework 2Construindo Aplicações Realmente Modulares

@Pauloelr

Page 2: Pilares do Zend Framework 2

Sobre Mim

@Pauloelr

Oi, Meu nome é Paulo EduardoEu não estou usando sintetizador de voz

Page 4: Pilares do Zend Framework 2

Um Pouco de História

Page 5: Pilares do Zend Framework 2

Zend Framework

Mantenedor: Zend Technologies

Líder de Projeto: Matthew Weier O’Phinney

Versão Atual: 2.5.3

Licença: BSD

Page 6: Pilares do Zend Framework 2

Zend Framework

Mantenedor: Zend Technologies

Líder de Projeto: Matthew Weier O’Phinney

Versão Atual: 2.5.3

Licença: BSD

2005 - Início do Projeto

Page 7: Pilares do Zend Framework 2

Zend Framework

Mantenedor: Zend Technologies

Líder de Projeto: Matthew Weier O’Phinney

Versão Atual: 2.5.3

Licença: BSD

2005 - Início do Projeto

2007 - Versão 1.0

Page 8: Pilares do Zend Framework 2

Zend Framework

Mantenedor: Zend Technologies

Líder de Projeto: Matthew Weier O’Phinney

Versão Atual: 2.5.3

Licença: BSD

2005 - Início do Projeto

2007 - Versão 1.0

2012 - Versão 2.0

Page 9: Pilares do Zend Framework 2

Zend Framework

Mantenedor: Zend Technologies

Líder de Projeto: Matthew Weier O’Phinney

Versão Atual: 2.5.3

Licença: BSD

2005 - Início do Projeto

2007 - Versão 1.0

2012 - Versão 2.0

2015 - Versão 2.5

Page 10: Pilares do Zend Framework 2

Zend Framework

Mantenedor: Zend Technologies

Líder de Projeto: Matthew Weier O’Phinney

Versão Atual: 2.5.3

Licença: BSD

2005 - Início do Projeto

2007 - Versão 1.0

2012 - Versão 2.0

2015 - Versão 2.5

2016 - Versão 3.0

Page 11: Pilares do Zend Framework 2

Zend Framework

Mantenedor: Zend Technologies

Líder de Projeto: Matthew Weier O’Phinney

Versão Atual: 2.5.3

Licença: BSD

2005 - Início do Projeto

2007 - Versão 1.0

2012 - Versão 2.0

Performance:

Curva de Aprendizado:

Facilidade de Uso:

Suporte da Comunidade:

Qualidade da Documentação:

Qualidade do Código:

Cobertura de Testes

Compatibilidade

2015 - Versão 2.5

2016 - Versão 3.0

Page 12: Pilares do Zend Framework 2

Previsão de Lançamento em 2016

Suporte ao PHP 5.6+

Com Suporte à Namespaces (PSR-4)

Framework FullStack como Meta-Repositório

Minimas Dependencias Entre Componentes

Aplicações Baseadas em Módulos ou Middlewares

Melhorias Técnicas Implementadas

Muito Mais Leve e Rápido

Suporte Oficial ao PHPUnit

Ausência de ORM (Somente TableGateway)

Suporte a Doctrine, Propel e Outros (Módulos)

Baixa Quebra de Compatibilidade com Versão 2.x

Zend Framework 3

Primeira Versão Estável Lançada em 2012

Suporte ao PHP 5.3.3+ (5.5+ Após 2.5.0)

Com Suporte à Namespaces (Padrão PHP)

Suporte ao Composer (Inclusive para Componentes)

Médias Dependências Entre Componentes

Aplicações Baseadas em Módulos

Melhorias Técnicas Implementadas

Menos Pesado (Ainda um Pouco)

Suporte Oficial ao PHPUnit

Ausência de ORM (Somente TableGateway)

Suporte a Doctrine, Propel e Outros (Módulos)

Alta Quebra de Compatibilidade com Versão 1.x

Zend Framework 2

Primeira Versão Estável Lançada em 2007

Suporte ao PHP 5.1.4+ (5.2.3+ Recomendada)

Sem Suporte à Namespaces (Uso Alternativo)

Sem Suporte a Composer (Instalação Manual)

Componentes Altamento Acoplados

Ausência de Módulos

Uso de Técnicas Consideradas Antipatterns

Bastante Pesado

Sem Suporte Oficial a Testes Unitários

Componente de ORM Próprio

Sem Suporte a Outros ORM’s

Retrocompatbilidade com Versões Anteriores

Zend Framework 1

Page 13: Pilares do Zend Framework 2

Os Pilares do Zend Framework 2

Page 14: Pilares do Zend Framework 2

Module Manager

Page 15: Pilares do Zend Framework 2

O Que são Módulos?

Our ultimate goal is extensible programming. By this, we mean the construction of hierarchies of modules, each module adding new functionality to the system

Niklaus Wirth

Page 16: Pilares do Zend Framework 2

Características do Module Manager

Gerencia os Módulos

Mescla as Configurações

Gerencia as Dependências

Extensibilidade de Módulos

Sobrescrita de Módulos

Page 17: Pilares do Zend Framework 2

Autoload de Modules<?php return [ 'modules' => [ 'Sample' ], 'module_listener_options' => [ 'config_glob_paths' => [ 'config/autoload/{,*.}{global,local}.php' ], 'module_paths' => [ './module', './vendor' ] ] ];

config/application.config.php

Formatos: .phar, .phar.gz, .phar.bz2, .phar.tar, .phar.tar.gz, .phar.tar.bz2, .phar.zip, .tar, .tar.gz, .tar.bz2, e .zip.

<?php chdir(dirname(__DIR__)); /** @noinspection PhpIncludeInspection */ require 'vendor/autoload.php'; /** @noinspection PhpIncludeInspection */ Zend\Mvc\Application::init(require 'config/application.config.php')->run();

index.php

Page 18: Pilares do Zend Framework 2

Módulos no Zend Framework 2

<?php namespace Sample; class Module{}

Module.php

Page 19: Pilares do Zend Framework 2

Módulos no Zend Framework 2

<?php namespace Sample; class Module { public function getConfig() { return include __DIR__ . ‘/../config/module.config.php’; } }

Module.php

Page 20: Pilares do Zend Framework 2

Módulos no Zend Framework 2<?php namespace Sample; use Zend\Stdlib\ArrayUtils; class Module { public function getConfig() { $config = []; $configFiles = [ __DIR__ . ‘/../config/module.config.php’, __DIR__ . ‘/../config/service.config.php’, ]; foreach ($configFiles as $configFile) { $config = ArrayUtils::merge($config, include $configFile); } return $config; } }

Module.php

Page 21: Pilares do Zend Framework 2

ModuleLoaderListener

Page 22: Pilares do Zend Framework 2

ModuleLoaderListener

AutoloaderListenergetAutooaderConfig()

Page 23: Pilares do Zend Framework 2

ModuleLoaderListener

AutoloaderListenergetAutooaderConfig()

ModuleDependencyCheckerListenergetModuleDependencies()

Page 24: Pilares do Zend Framework 2

ModuleLoaderListener

AutoloaderListenergetAutooaderConfig()

ModuleDependencyCheckerListenergetModuleDependencies()

ConfigListenergetConfig()

Page 25: Pilares do Zend Framework 2

ModuleLoaderListener

AutoloaderListenergetAutooaderConfig()

ModuleDependencyCheckerListenergetModuleDependencies()

InitTriggerinit()

ConfigListenergetConfig()

Page 26: Pilares do Zend Framework 2

ModuleLoaderListener

AutoloaderListenergetAutooaderConfig()

ModuleDependencyCheckerListenergetModuleDependencies()

InitTriggerinit()

ConfigListenergetConfig()

LocatorRegistrationListener

Page 27: Pilares do Zend Framework 2

ModuleLoaderListener

AutoloaderListenergetAutooaderConfig()

ModuleDependencyCheckerListenergetModuleDependencies()

InitTriggerinit()

ConfigListenergetConfig()

LocatorRegistrationListener

ModuleResolverListener

Page 28: Pilares do Zend Framework 2

ModuleLoaderListener

AutoloaderListenergetAutooaderConfig()

ModuleDependencyCheckerListenergetModuleDependencies()

InitTriggerinit()

ConfigListenergetConfig()

LocatorRegistrationListener

ModuleResolverListener

OnBootstrapListeneronBootstrap()

Page 29: Pilares do Zend Framework 2

ModuleLoaderListener

AutoloaderListenergetAutooaderConfig()

ModuleDependencyCheckerListenergetModuleDependencies()

InitTriggerinit()

ConfigListenergetConfig()

LocatorRegistrationListener

ModuleResolverListener

OnBootstrapListeneronBootstrap()

ServiceListenergetServiceConfig()

Page 30: Pilares do Zend Framework 2

Configuration Merge<?php return [ ‘router’ => [ ‘routes’ => [ ‘user’ => [ ‘type’ => ‘Literal’, ‘options’ => [ ‘route’ => ‘/user’, ‘defaults’ => [ ‘__NAMESPACE__’ => ‘Sample\Controller’, ‘controller’ => ‘User’, ‘action’ => ‘index’, ],],],],],];

Módulo de Terceiro (ThirdUser)

Page 31: Pilares do Zend Framework 2

Configuration Merge<?php return [ ‘router’ => [ ‘routes’ => [ ‘user’ => [ ‘type’ => ‘Literal’, ‘options’ => [ ‘route’ => ‘/user’, ‘defaults’ => [ ‘__NAMESPACE__’ => ‘Sample\Controller’, ‘controller’ => ‘User’, ‘action’ => ‘index’, ],],],],],];

Módulo de Terceiro (ThirdUser)

<?php return [ ‘router’ => [ ‘routes’ => [ ‘user’ => [ ‘options’ => [ ‘route’ => ‘admin/user’, ], ], ], ], ];

Meu Módulo (MyUser)

Page 32: Pilares do Zend Framework 2

Configuration Merge<?php return [ ‘router’ => [ ‘routes’ => [ ‘user’ => [ ‘type’ => ‘Literal’, ‘options’ => [ ‘route’ => ‘/user’, ‘defaults’ => [ ‘__NAMESPACE__’ => ‘Sample\Controller’, ‘controller’ => ‘User’, ‘action’ => ‘index’, ],],],],],];

Módulo de Terceiro (ThirdUser)

<?php return [ ‘router’ => [ ‘routes’ => [ ‘user’ => [ ‘options’ => [ ‘route’ => ‘admin/user’, ], ], ], ], ];

Meu Módulo (MyUser)

<?php return [ ‘modules’ => [ ‘ThirdUser’, ‘MyUser’ ], ];

config/application.config.php

Page 33: Pilares do Zend Framework 2

Configuration Merge<?php return [ ‘router’ => [ ‘routes’ => [ ‘user’ => [ ‘type’ => ‘Literal’, ‘options’ => [ ‘route’ => ‘/user’, ‘defaults’ => [ ‘__NAMESPACE__’ => ‘Sample\Controller’, ‘controller’ => ‘User’, ‘action’ => ‘index’, ],],],],],];

Módulo de Terceiro (ThirdUser)

<?php return [ ‘router’ => [ ‘routes’ => [ ‘user’ => [ ‘options’ => [ ‘route’ => ‘admin/user’, ], ], ], ], ];

Meu Módulo (MyUser)

<?php return [ 'router' => [ 'routes' => [ 'user' => [ 'type' => 'Literal', 'options' => [ 'route' => 'admin/user', 'defaults' => [ '__NAMESPACE__' => 'Sample\Controller', 'controller' => 'User', 'action' => 'index', ], ], ], ], ], ];

Resultado

<?php return [ ‘modules’ => [ ‘ThirdUser’, ‘MyUser’ ], ];

config/application.config.php

Page 34: Pilares do Zend Framework 2

DoctrineORMModule

ZfcUser

TwbBundle

ZfcRbac ZfcTwig

http://modules.zendframework.com/

Page 35: Pilares do Zend Framework 2

Service Manager

Page 36: Pilares do Zend Framework 2

O Que são Serviços?

A mechanism to enable access to one or more capabilities, where the access is provided using a prescribed interface and is exercised consistent with constraints and policies

as specified by the service description.Organization for the Advancement of Structured Information Standards (OASIS)

Page 37: Pilares do Zend Framework 2

Características do Service Manager

Gerencia os Serviços

Injeção de Dependências

Inversão do Controle

Serviços Modulares

Compartilhados ou

Independentes

Page 38: Pilares do Zend Framework 2

Serviços no Zend Framework 2<?php use Sample\User\Form\UserFieldset; use Sample\User\Form\UserFieldsetFactory; use Sample\User\Form\UserForm; use Sample\User\Form\UserFormFactory; use Sample\User\Mapper\UserMapperFactory; use Sample\User\Controller\UserControllerFactory; return [ 'service_manager'=>[ 'factories' => [ 'Sample\User\Mapper\UserMapper' => UserMapperFactory::class, ], ], 'form_elements'=>[ 'factories' => [ UserFieldset::class => UserFieldsetFactory::class, UserForm::class => UserFormFactory::class, ], ], 'controllers'=>[ 'factories' => [ 'Sample\User\Controller\User' => UserControllerFactory::class, ], ], ];

Page 39: Pilares do Zend Framework 2

Serviços no Zend Framework 2<?php namespace Sample\User\Form; use Doctrine\Common\Persistence\ObjectManager; use Doctrine\ORM\EntityManager; use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator; use Sample\User\Entity\User; use Zend\Form\FormElementManager; use Zend\ServiceManager\FactoryInterface; use Zend\ServiceManager\ServiceLocatorInterface; class UserFieldsetFactory implements FactoryInterface { public function createService(ServiceLocatorInterface $formManager) { /** @var $formManager FormElementManager */ $serviceManager = $formManager->getServiceLocator(); /** @var $objectManager ObjectManager */ $objectManager = $serviceManager->get(EntityManager::class); $userFieldset = new UserFieldset(); $userHydrator = new DoctrineHydrator($objectManager, User::class); $userFieldset->setHydrator($userHydrator); $userFieldset->setObject(new User()); return $userFieldset; } }

Page 40: Pilares do Zend Framework 2

Tipos de ServiçosPlugin Manager Config Key Interface Module MethodZend\Mvc\Controller\ControllerManager controllers ControllerProviderInterface getControllerConfig

Zend\Mvc\Controller\PluginManager controller_plugins ControllerPluginProviderInterface getControllerPluginConfig

Zend\Filter\FilterPluginManager filters FilterProviderInterface getFilterConfig

Zend\Form\FormElementManager form_elements FormElementProviderInterface getFormElementConfig

Zend\Stdlib\Hydrator\HydratorPluginManager hydrators HydratorProviderInterface getHydratorConfig

Zend\InputFilter\InputFilterPluginManager input_filters InputFilterProviderInterface getInputFilterConfig

Zend\Mvc\Router\RoutePluginManager route_manager RouteProviderInterface getRouteConfig

Zend\Serializer\AdapterPluginManager serializers SerializerProviderInterface getSerializerConfig

Zend\ServiceManager\ServiceManager service_manager ServiceProviderInterface getServiceConfig

Zend\Validator\ValidatorPluginManager validators ValidatorProviderInterface getValidatorConfig

Zend\View\HelperPluginManager view_helpers ViewHelperProviderInterface getViewHelperConfig

Zend\Log\ProcessorPluginManager log_processors LogProcessorProviderInterface getLogProcessorConfig

Zend\Log\WriterPluginManager log_writers LogWriterProviderInterface getLogWriterConfig

services, invokables, factories, abstract_factories

Page 41: Pilares do Zend Framework 2

Event Manager

Page 42: Pilares do Zend Framework 2

O Que são Eventos?

An event is an action or occurrence recognised by software that may be handled by the software

Wikipedia

Page 43: Pilares do Zend Framework 2

Características do Event Manager

Event Driven Architecture

Evento MVC(“Principal“)

Integração entre Módulos

Eventos Personalizados

Compartilhados ou

Independentes

Page 44: Pilares do Zend Framework 2

Eventos no Zend Framework 2<?php use Zend\EventManager\EventManager; use Zend\EventManager\EventManagerAwareInterface; use Zend\EventManager\EventManagerInterface; class Example implements EventManagerAwareInterface { protected $events; public function setEventManager(EventManagerInterface $events) { $events->setIdentifiers(array( __CLASS__, get_class($this) )); $this->events = $events; } public function getEventManager() { if (!$this->events) { $this->setEventManager(new EventManager()); } return $this->events; } public function doIt($foo, $baz) { $params = compact(‘foo’, ‘baz’); $this->getEventManager()->trigger(__FUNCTION__, $this, $params); } }

Page 45: Pilares do Zend Framework 2

Eventos no Zend Framework 2<?php use Zend\EventManager\EventManager; use Zend\EventManager\EventManagerAwareInterface; use Zend\EventManager\EventManagerInterface; class Example implements EventManagerAwareInterface { protected $events; public function setEventManager(EventManagerInterface $events) { $events->setIdentifiers(array( __CLASS__, get_class($this) )); $this->events = $events; } public function getEventManager() { if (!$this->events) { $this->setEventManager(new EventManager()); } return $this->events; } public function doIt($foo, $baz) { $params = compact(‘foo’, ‘baz’); $this->getEventManager()->trigger(__FUNCTION__, $this, $params); } }

<?php $example = new Example(); $example->getEventManager()->attach('doIt', function($e) { /** @var $e \Zend\EventManager\EventInterface */ $event = $e->getName(); $target = get_class($e->getTarget()); // "Example" $params = $e->getParams(); printf( 'Handled event "%s" on target "%s", with parameters %s', $event, $target, json_encode($params) ); }); $example->doIt('bar', 'bat');

Page 46: Pilares do Zend Framework 2

Eventos no Zend Framework 2<?php use Zend\EventManager\EventManager; use Zend\EventManager\EventManagerAwareInterface; use Zend\EventManager\EventManagerInterface; class Example implements EventManagerAwareInterface { protected $events; public function setEventManager(EventManagerInterface $events) { $events->setIdentifiers(array( __CLASS__, get_class($this) )); $this->events = $events; } public function getEventManager() { if (!$this->events) { $this->setEventManager(new EventManager()); } return $this->events; } public function doIt($foo, $baz) { $params = compact(‘foo’, ‘baz’); $this->getEventManager()->trigger(__FUNCTION__, $this, $params); } }

<?php use Zend\EventManager\SharedEventManager; $sharedEvents = new SharedEventManager(); $sharedEvents->attach(‘Example’, ‘do’, function ($e) { /** @var $e \Zend\EventManager\EventInterface */ $event = $e->getName(); $target = get_class($e->getTarget()); // “Example” $params = $e->getParams(); printf( ‘Handled event “%s” on target “%s”, with parameters %s’, $event, $target, json_encode($params) ); }); $example = new Example(); $example->getEventManager()->setSharedManager($sharedEvents); $example->doIt(‘bar’, ‘bat’);

Page 47: Pilares do Zend Framework 2

Exemplos de Eventos<?php namespace Sample\User\Service; use Zend\EventManager\EventManager; use Zend\EventManager\EventManagerAwareInterface; use Zend\EventManager\EventManagerInterface; class UserService implements EventManagerAwareInterface { protected $eventManager; public function addUser($user) { // Logic to Add User $this->getEventManager()->trigger('addUser', null, array('user' => $user)); } public function setEventManager(EventManagerInterface $eventManager) { $eventManager->addIdentifiers(array( get_called_class() )); $this->eventManager = $eventManager; } public function getEventManager() { if (null === $this->eventManager) { $this->setEventManager(new EventManager()); } return $this->eventManager; } }

Page 48: Pilares do Zend Framework 2

Exemplos de Eventos<?php namespace Sample\User; use Zend\Mvc\MvcEvent; class Module { public function onBootstrap(MvcEvent $event) { $eventManager = $event->getApplication()->getEventManager(); $sharedEventManager = $eventManager->getSharedManager(); $sharedEventManager->attach('Sample\User\Service\UserService', 'addUser', function($e) { //Logic to Send User }, 100); } }

Page 49: Pilares do Zend Framework 2

Exemplos de Eventos<?php namespace Sample\User; use Zend\Mvc\MvcEvent; class Module { public function onBootstrap(MvcEvent $event) { $eventManager = $event->getApplication()->getEventManager(); $sharedEventManager = $eventManager->getSharedManager(); $sharedEventManager->attach('Sample\User\Service\UserService', 'addUser', function($e) { //Logic to Send Mail }, 100); } }

<?php namespace Sample\User; use Zend\Mvc\MvcEvent; class Module { public function onBootstrap(MvcEvent $event) { $eventManager = $event->getApplication()->getEventManager(); $sharedEventManager = $eventManager->getSharedManager(); $emailListener = new EmailListener(); $emailListener->attachShared($sharedEventManager); } }

Page 50: Pilares do Zend Framework 2

Exemplos de Eventos<?php namespace Sample\User\Listener; use Zend\EventManager\SharedEventManagerInterface; use Zend\EventManager\SharedListenerAggregateInterface; use Zend\Mvc\MvcEvent; class EmailListener implements SharedListenerAggregateInterface { protected $listeners = []; public function attachShared(SharedEventManagerInterface $eventManager, $priority = 100) { $this->listeners[] = $eventManager->attach( ‘Sample\User\Service\UserService’, ‘addUser’, [$this, 'onAddUser'], $priority ); } public function detachShared(SharedEventManagerInterface $eventManager) { foreach ($this->listeners as $index => $listener) { if ($eventManager->detach(‘Sample\User\Service\UserService’, $listener)) { unset($this->listeners[$index]); } } } public function onAddUser($event) { //Logic to Send User } }

Page 51: Pilares do Zend Framework 2

Evento MVC

Page 52: Pilares do Zend Framework 2

MvcEvent::EVENT_BOOTSTRAPbootstrap

Page 53: Pilares do Zend Framework 2

MvcEvent::EVENT_BOOTSTRAPbootstrap

MvcEvent::EVENT_ROUTEroute

Page 54: Pilares do Zend Framework 2

MvcEvent::EVENT_BOOTSTRAPbootstrap

MvcEvent::EVENT_ROUTEroute

MvcEvent::EVENT_DISPATCHdispatch

Page 55: Pilares do Zend Framework 2

MvcEvent::EVENT_BOOTSTRAPbootstrap

MvcEvent::EVENT_ROUTEroute

MvcEvent::EVENT_DISPATCHdispatch

MvcEvent::EVENT_DISPATCH_ERRORdispatch.error

Page 56: Pilares do Zend Framework 2

MvcEvent::EVENT_BOOTSTRAPbootstrap

MvcEvent::EVENT_ROUTEroute

MvcEvent::EVENT_DISPATCHdispatch

MvcEvent::EVENT_RENDERrenderer

MvcEvent::EVENT_DISPATCH_ERRORdispatch.error

Page 57: Pilares do Zend Framework 2

MvcEvent::EVENT_BOOTSTRAPbootstrap

MvcEvent::EVENT_ROUTEroute

MvcEvent::EVENT_DISPATCHdispatch

MvcEvent::EVENT_RENDERrenderer

MvcEvent::EVENT_DISPATCH_ERRORdispatch.error

MvcEvent::EVENT_RENDER_ERRORrender.error

Page 58: Pilares do Zend Framework 2

MvcEvent::EVENT_BOOTSTRAPbootstrap

MvcEvent::EVENT_ROUTEroute

MvcEvent::EVENT_DISPATCHdispatch

MvcEvent::EVENT_RENDERrenderer

MvcEvent::EVENT_DISPATCH_ERRORdispatch.error

MvcEvent::EVENT_RENDER_ERRORrender.error

MvcEvent::EVENT_FINISHfinish

Page 59: Pilares do Zend Framework 2

Evento MVC<?php namespace Psyco\Pantheon\Core\Layout\Listener; use Zend\EventManager\SharedEventManagerInterface; use Zend\EventManager\SharedListenerAggregateInterface; use Zend\Mvc\MvcEvent; class CrazyListener implements SharedListenerAggregateInterface { protected $listeners = []; public function attachShared(SharedEventManagerInterface $eventManager, $priority = 100) { $this->listeners[] = $eventManager->attach( 'application', MvcEvent::EVENT_DISPATCH, [$this, 'doSomethingCrazy'], $priority ); } public function detachShared(SharedEventManagerInterface $eventManager){//...} public function doSomethingCrazy(MvcEvent $mvcEvent){//Do Something Crazy} }

Page 60: Pilares do Zend Framework 2

Evento MVC<?php namespace Psyco\Pantheon\Core\Layout\Listener; use Zend\EventManager\SharedEventManagerInterface; use Zend\EventManager\SharedListenerAggregateInterface; use Zend\Mvc\MvcEvent; class CrazyListener implements SharedListenerAggregateInterface { protected $listeners = []; public function attachShared(SharedEventManagerInterface $eventManager, $priority = 100) { $this->listeners[] = $eventManager->attach( 'application', MvcEvent::EVENT_DISPATCH, [$this, 'doSomethingCrazy'], $priority ); } public function detachShared(SharedEventManagerInterface $eventManager){//...} public function doSomethingCrazy(MvcEvent $mvcEvent){//Do Something Crazy} }

<?php namespace Sample\User; use Zend\Mvc\MvcEvent; class Module { public function onBootstrap(MvcEvent $event) { $eventManager = $event->getApplication()->getEventManager(); $sharedEventManager = $eventManager->getSharedManager(); $crazyListener = new CrazyListener(); $crazyListener->attachShared($sharedEventManager); } }

Page 61: Pilares do Zend Framework 2

Novidades

Page 62: Pilares do Zend Framework 2

Componentes Modularizados

Page 63: Pilares do Zend Framework 2

Middlewares

Page 64: Pilares do Zend Framework 2

Conclusão

Page 65: Pilares do Zend Framework 2

Dúvidas?

Page 66: Pilares do Zend Framework 2

Obrigado a Todos

Page 67: Pilares do Zend Framework 2

Obrigado a Todos

AgradecimentosPHPSP