15. 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
16. 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
18. MĂłdulos no Zend Framework 2
<?php
namespace Sample;
class Module{}
Module.php
19. MĂłdulos no Zend Framework 2
<?php
namespace Sample;
class Module
{
public function getConfig()
{
return include __DIR__ . â/../config/module.config.phpâ;
}
}
Module.php
20. MĂłdulos no Zend Framework 2
<?php
namespace Sample;
use ZendStdlibArrayUtils;
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
36. 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)
37. CaracterĂsticas do Service Manager
Gerencia
os Serviços
Injeção de
DependĂȘncias
InversĂŁo do
Controle
Serviços
Modulares
Compartilhados
ou
Independentes
38. Serviços no Zend Framework 2
<?php
use SampleUserFormUserFieldset;
use SampleUserFormUserFieldsetFactory;
use SampleUserFormUserForm;
use SampleUserFormUserFormFactory;
use SampleUserMapperUserMapperFactory;
use SampleUserControllerUserControllerFactory;
return [
'service_manager'=>[
'factories' => [
'SampleUserMapperUserMapper' => UserMapperFactory::class,
],
],
'form_elements'=>[
'factories' => [
UserFieldset::class => UserFieldsetFactory::class,
UserForm::class => UserFormFactory::class,
],
],
'controllers'=>[
'factories' => [
'SampleUserControllerUser' => UserControllerFactory::class,
],
],
];
39. Serviços no Zend Framework 2
<?php
namespace SampleUserForm;
use DoctrineCommonPersistenceObjectManager;
use DoctrineORMEntityManager;
use DoctrineModuleStdlibHydratorDoctrineObject as DoctrineHydrator;
use SampleUserEntityUser;
use ZendFormFormElementManager;
use ZendServiceManagerFactoryInterface;
use ZendServiceManagerServiceLocatorInterface;
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;
}
}
42. O Que sĂŁo Eventos?
An event is an action or occurrence recognised
by software that may be handled by the software
Wikipedia
43. CaracterĂsticas do Event Manager
Event Driven
Architecture
Evento MVC
(âPrincipalâ)
Integração
entre MĂłdulos
Eventos
Personalizados
Compartilhados
ou
Independentes
44. Eventos no Zend Framework 2
<?php
use ZendEventManagerEventManager;
use ZendEventManagerEventManagerAwareInterface;
use ZendEventManagerEventManagerInterface;
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);
}
}
45. Eventos no Zend Framework 2
<?php
use ZendEventManagerEventManager;
use ZendEventManagerEventManagerAwareInterface;
use ZendEventManagerEventManagerInterface;
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 ZendEventManagerEventInterface */
$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');
46. Eventos no Zend Framework 2
<?php
use ZendEventManagerEventManager;
use ZendEventManagerEventManagerAwareInterface;
use ZendEventManagerEventManagerInterface;
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 ZendEventManagerSharedEventManager;
$sharedEvents = new SharedEventManager();
$sharedEvents->attach(âExampleâ, âdoâ, function ($e) {
/** @var $e ZendEventManagerEventInterface */
$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â);
47. Exemplos de Eventos
<?php
namespace SampleUserService;
use ZendEventManagerEventManager;
use ZendEventManagerEventManagerAwareInterface;
use ZendEventManagerEventManagerInterface;
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;
}
}
48. Exemplos de Eventos
<?php
namespace SampleUser;
use ZendMvcMvcEvent;
class Module
{
public function onBootstrap(MvcEvent $event)
{
$eventManager = $event->getApplication()->getEventManager();
$sharedEventManager = $eventManager->getSharedManager();
$sharedEventManager->attach('SampleUserServiceUserService', 'addUser', function($e) {
//Logic to Send User
}, 100);
}
}
49. Exemplos de Eventos
<?php
namespace SampleUser;
use ZendMvcMvcEvent;
class Module
{
public function onBootstrap(MvcEvent $event)
{
$eventManager = $event->getApplication()->getEventManager();
$sharedEventManager = $eventManager->getSharedManager();
$sharedEventManager->attach('SampleUserServiceUserService', 'addUser', function($e) {
//Logic to Send Mail
}, 100);
}
}
<?php
namespace SampleUser;
use ZendMvcMvcEvent;
class Module
{
public function onBootstrap(MvcEvent $event)
{
$eventManager = $event->getApplication()->getEventManager();
$sharedEventManager = $eventManager->getSharedManager();
$emailListener = new EmailListener();
$emailListener->attachShared($sharedEventManager);
}
}
50. Exemplos de Eventos
<?php
namespace SampleUserListener;
use ZendEventManagerSharedEventManagerInterface;
use ZendEventManagerSharedListenerAggregateInterface;
use ZendMvcMvcEvent;
class EmailListener implements SharedListenerAggregateInterface
{
protected $listeners = [];
public function attachShared(SharedEventManagerInterface $eventManager, $priority = 100)
{
$this->listeners[] = $eventManager->attach(
âSampleUserServiceUserServiceâ,
âaddUserâ,
[$this, 'onAddUser'],
$priority
);
}
public function detachShared(SharedEventManagerInterface $eventManager)
{
foreach ($this->listeners as $index => $listener) {
if ($eventManager->detach(âSampleUserServiceUserServiceâ, $listener)) {
unset($this->listeners[$index]);
}
}
}
public function onAddUser($event)
{
//Logic to Send User
}
}
59. Evento MVC
<?php
namespace PsycoPantheonCoreLayoutListener;
use ZendEventManagerSharedEventManagerInterface;
use ZendEventManagerSharedListenerAggregateInterface;
use ZendMvcMvcEvent;
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}
}
60. Evento MVC
<?php
namespace PsycoPantheonCoreLayoutListener;
use ZendEventManagerSharedEventManagerInterface;
use ZendEventManagerSharedListenerAggregateInterface;
use ZendMvcMvcEvent;
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 SampleUser;
use ZendMvcMvcEvent;
class Module
{
public function onBootstrap(MvcEvent $event)
{
$eventManager = $event->getApplication()->getEventManager();
$sharedEventManager = $eventManager->getSharedManager();
$crazyListener = new CrazyListener();
$crazyListener->attachShared($sharedEventManager);
}
}