pilares do zend framework 2
Post on 10-Jan-2017
175 Views
Preview:
TRANSCRIPT
Os Pilares do Zend Framework 2Construindo Aplicações Realmente Modulares
@Pauloelr
Sobre Mim
@Pauloelr
Oi, Meu nome é Paulo EduardoEu não estou usando sintetizador de voz
Zend Framework
Mantenedor: Zend Technologies
Líder de Projeto: Matthew Weier O’Phinney
Versão Atual: 2.5.3
Licença: BSD
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
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
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
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
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
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
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
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
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
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
Módulos no Zend Framework 2
<?php namespace Sample; class Module{}
Module.php
Módulos no Zend Framework 2
<?php namespace Sample; class Module { public function getConfig() { return include __DIR__ . ‘/../config/module.config.php’; } }
Module.php
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
ModuleLoaderListener
AutoloaderListenergetAutooaderConfig()
ModuleDependencyCheckerListenergetModuleDependencies()
ModuleLoaderListener
AutoloaderListenergetAutooaderConfig()
ModuleDependencyCheckerListenergetModuleDependencies()
ConfigListenergetConfig()
ModuleLoaderListener
AutoloaderListenergetAutooaderConfig()
ModuleDependencyCheckerListenergetModuleDependencies()
InitTriggerinit()
ConfigListenergetConfig()
ModuleLoaderListener
AutoloaderListenergetAutooaderConfig()
ModuleDependencyCheckerListenergetModuleDependencies()
InitTriggerinit()
ConfigListenergetConfig()
LocatorRegistrationListener
ModuleLoaderListener
AutoloaderListenergetAutooaderConfig()
ModuleDependencyCheckerListenergetModuleDependencies()
InitTriggerinit()
ConfigListenergetConfig()
LocatorRegistrationListener
ModuleResolverListener
ModuleLoaderListener
AutoloaderListenergetAutooaderConfig()
ModuleDependencyCheckerListenergetModuleDependencies()
InitTriggerinit()
ConfigListenergetConfig()
LocatorRegistrationListener
ModuleResolverListener
OnBootstrapListeneronBootstrap()
ModuleLoaderListener
AutoloaderListenergetAutooaderConfig()
ModuleDependencyCheckerListenergetModuleDependencies()
InitTriggerinit()
ConfigListenergetConfig()
LocatorRegistrationListener
ModuleResolverListener
OnBootstrapListeneronBootstrap()
ServiceListenergetServiceConfig()
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)
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)
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
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
DoctrineORMModule
ZfcUser
TwbBundle
ZfcRbac ZfcTwig
http://modules.zendframework.com/
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)
Características do Service Manager
Gerencia os Serviços
Injeção de Dependências
Inversão do Controle
Serviços Modulares
Compartilhados ou
Independentes
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, ], ], ];
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; } }
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
O Que são Eventos?
An event is an action or occurrence recognised by software that may be handled by the software
Wikipedia
Características do Event Manager
Event Driven Architecture
Evento MVC(“Principal“)
Integração entre Módulos
Eventos Personalizados
Compartilhados ou
Independentes
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); } }
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');
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’);
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; } }
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); } }
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); } }
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 } }
MvcEvent::EVENT_BOOTSTRAPbootstrap
MvcEvent::EVENT_ROUTEroute
MvcEvent::EVENT_DISPATCHdispatch
MvcEvent::EVENT_BOOTSTRAPbootstrap
MvcEvent::EVENT_ROUTEroute
MvcEvent::EVENT_DISPATCHdispatch
MvcEvent::EVENT_DISPATCH_ERRORdispatch.error
MvcEvent::EVENT_BOOTSTRAPbootstrap
MvcEvent::EVENT_ROUTEroute
MvcEvent::EVENT_DISPATCHdispatch
MvcEvent::EVENT_RENDERrenderer
MvcEvent::EVENT_DISPATCH_ERRORdispatch.error
MvcEvent::EVENT_BOOTSTRAPbootstrap
MvcEvent::EVENT_ROUTEroute
MvcEvent::EVENT_DISPATCHdispatch
MvcEvent::EVENT_RENDERrenderer
MvcEvent::EVENT_DISPATCH_ERRORdispatch.error
MvcEvent::EVENT_RENDER_ERRORrender.error
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
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} }
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); } }
top related