pilares do zend framework 2

Post on 10-Jan-2017

175 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

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

Um Pouco de História

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

Os Pilares do Zend Framework 2

Module Manager

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

ModuleLoaderListener

AutoloaderListenergetAutooaderConfig()

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/

Service Manager

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

Event Manager

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 } }

Evento MVC

MvcEvent::EVENT_BOOTSTRAPbootstrap

MvcEvent::EVENT_BOOTSTRAPbootstrap

MvcEvent::EVENT_ROUTEroute

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); } }

Novidades

Componentes Modularizados

Middlewares

Conclusão

Dúvidas?

Obrigado a Todos

Obrigado a Todos

AgradecimentosPHPSP

top related