Zend framework ZF3:EventManager中的SharedEventManager注入
在ZF2中,使用共享事件管理器跨多个控制器共享事件 Module.phpZend framework ZF3:EventManager中的SharedEventManager注入,zend-framework,dependency-injection,zend-framework3,Zend Framework,Dependency Injection,Zend Framework3,在ZF2中,使用共享事件管理器跨多个控制器共享事件 Module.php use Zend\Mvc\MvcEvent; class Module { public function getConfig() { return include __DIR__ . '/../config/module.config.php'; } public function onBootstrap(MvcEvent $event) { $
use Zend\Mvc\MvcEvent;
class Module
{
public function getConfig()
{
return include __DIR__ . '/../config/module.config.php';
}
public function onBootstrap(MvcEvent $event)
{
$services = $event->getApplication()->getServiceManager();
$sharedEventManager = $eventManager->getSharedManager();
$sharedEventManager->attach('user', 'log-fail', function($event) use ($services) {
$username = $event->getParam('username');
$log = $services->get('log');
$log->warn('Error logging user: ' . $username);
});
}
}
<?php
namespace Application\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\EventManager\EventManager;
class LogController extends AbstractActionController
{
public function __construct()
{
}
public function inAction()
{
//...
if (! $isValid) {
$event = new EventManager('user');
$event->trigger('log-fail', $this, array('username'=> $username));
//...
}
}
}
<?php
namespace Application\Controller;
use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;
class LogControllerFactory implements FactoryInterface
{
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$sharedEventManager = ???
return new LogController($sharedEventManager);
}
}
LogController.php
use Zend\Mvc\MvcEvent;
class Module
{
public function getConfig()
{
return include __DIR__ . '/../config/module.config.php';
}
public function onBootstrap(MvcEvent $event)
{
$services = $event->getApplication()->getServiceManager();
$sharedEventManager = $eventManager->getSharedManager();
$sharedEventManager->attach('user', 'log-fail', function($event) use ($services) {
$username = $event->getParam('username');
$log = $services->get('log');
$log->warn('Error logging user: ' . $username);
});
}
}
<?php
namespace Application\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\EventManager\EventManager;
class LogController extends AbstractActionController
{
public function __construct()
{
}
public function inAction()
{
//...
if (! $isValid) {
$event = new EventManager('user');
$event->trigger('log-fail', $this, array('username'=> $username));
//...
}
}
}
<?php
namespace Application\Controller;
use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;
class LogControllerFactory implements FactoryInterface
{
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$sharedEventManager = ???
return new LogController($sharedEventManager);
}
}
回答我自己的问题: 1。config.php
use Zend\Mvc\MvcEvent;
class Module
{
public function getConfig()
{
return include __DIR__ . '/../config/module.config.php';
}
public function onBootstrap(MvcEvent $event)
{
$services = $event->getApplication()->getServiceManager();
$sharedEventManager = $eventManager->getSharedManager();
$sharedEventManager->attach('user', 'log-fail', function($event) use ($services) {
$username = $event->getParam('username');
$log = $services->get('log');
$log->warn('Error logging user: ' . $username);
});
}
}
<?php
namespace Application\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\EventManager\EventManager;
class LogController extends AbstractActionController
{
public function __construct()
{
}
public function inAction()
{
//...
if (! $isValid) {
$event = new EventManager('user');
$event->trigger('log-fail', $this, array('username'=> $username));
//...
}
}
}
<?php
namespace Application\Controller;
use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;
class LogControllerFactory implements FactoryInterface
{
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$sharedEventManager = ???
return new LogController($sharedEventManager);
}
}
配置文件
/..
'controllers' => [
'factories' => [
Controller\LogController::class => Controller\LogControllerFactory::class,
/..
],
'aliases' => [
'log' => Controller\LogController::class,
/..
]
],
/..
'service_manager' => [
'factories' => [
'log' => Service\Log::class,
],
],
/..
2。Module.php
use Zend\Mvc\MvcEvent;
class Module
{
public function getConfig()
{
return include __DIR__ . '/../config/module.config.php';
}
public function onBootstrap(MvcEvent $event)
{
$services = $event->getApplication()->getServiceManager();
$sharedEventManager = $eventManager->getSharedManager();
$sharedEventManager->attach('user', 'log-fail', function($event) use ($services) {
$username = $event->getParam('username');
$log = $services->get('log');
$log->warn('Error logging user: ' . $username);
});
}
}
<?php
namespace Application\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\EventManager\EventManager;
class LogController extends AbstractActionController
{
public function __construct()
{
}
public function inAction()
{
//...
if (! $isValid) {
$event = new EventManager('user');
$event->trigger('log-fail', $this, array('username'=> $username));
//...
}
}
}
<?php
namespace Application\Controller;
use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;
class LogControllerFactory implements FactoryInterface
{
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$sharedEventManager = ???
return new LogController($sharedEventManager);
}
}
模块文件
namespace Application;
use Zend\Mvc\MvcEvent;
class Module
{
public function getConfig()
{
return include __DIR__ . '/../config/module.config.php';
}
public function onBootstrap(MvcEvent $event)
{
// Get shared service manager
$services = $event->getApplication()->getServiceManager();
$sharedEventManager = $eventManager->getSharedManager();
// Attach listener
$sharedEventManager->attach('user', 'log-fail', function($event) use ($services) {
$username = $event->getParam('username');
$log = $services->get('log');
$log->warn('Error logging user: ' . $username);
});
}
}
3。LogService.php
use Zend\Mvc\MvcEvent;
class Module
{
public function getConfig()
{
return include __DIR__ . '/../config/module.config.php';
}
public function onBootstrap(MvcEvent $event)
{
$services = $event->getApplication()->getServiceManager();
$sharedEventManager = $eventManager->getSharedManager();
$sharedEventManager->attach('user', 'log-fail', function($event) use ($services) {
$username = $event->getParam('username');
$log = $services->get('log');
$log->warn('Error logging user: ' . $username);
});
}
}
<?php
namespace Application\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\EventManager\EventManager;
class LogController extends AbstractActionController
{
public function __construct()
{
}
public function inAction()
{
//...
if (! $isValid) {
$event = new EventManager('user');
$event->trigger('log-fail', $this, array('username'=> $username));
//...
}
}
}
<?php
namespace Application\Controller;
use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;
class LogControllerFactory implements FactoryInterface
{
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$sharedEventManager = ???
return new LogController($sharedEventManager);
}
}
服务文件
namespace Application\Service;
use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\Log\Logger;
use Zend\Log\Writer\Stream as StreamWriter;
use Zend\Log\Filter\Priority as PriorityFilter;
class Log implements FactoryInterface
{
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$controllerPluginManager = $container;
$serviceManager = $controllerPluginManager->get('ServiceManager');
// Instantiate Zend\Log\Logger
$log = new Logger();
// Set stream to write in a log file
$writer = new StreamWriter('data/logs/audit.log');
$log->addWriter($writer);
return $log;
}
}
4。LogControllerFactory.php*
控制器工厂文件
namespace Application\Controller;
use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;
class LogControllerFactory implements FactoryInterface
{
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$controllerPluginManager = $container;
$eventManager = $controllerPluginManager->get('EventManager');
$sharedEventManager = $eventManager->getSharedManager();
return new LogController($sharedEventManager);
}
}
5。LogController.php
use Zend\Mvc\MvcEvent;
class Module
{
public function getConfig()
{
return include __DIR__ . '/../config/module.config.php';
}
public function onBootstrap(MvcEvent $event)
{
$services = $event->getApplication()->getServiceManager();
$sharedEventManager = $eventManager->getSharedManager();
$sharedEventManager->attach('user', 'log-fail', function($event) use ($services) {
$username = $event->getParam('username');
$log = $services->get('log');
$log->warn('Error logging user: ' . $username);
});
}
}
<?php
namespace Application\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\EventManager\EventManager;
class LogController extends AbstractActionController
{
public function __construct()
{
}
public function inAction()
{
//...
if (! $isValid) {
$event = new EventManager('user');
$event->trigger('log-fail', $this, array('username'=> $username));
//...
}
}
}
<?php
namespace Application\Controller;
use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;
class LogControllerFactory implements FactoryInterface
{
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$sharedEventManager = ???
return new LogController($sharedEventManager);
}
}
控制器文件
namespace Application\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\EventManager\EventManager;
use Zend\EventManager\SharedEventManager;
class LogController extends AbstractActionController
{
public function __construct(SharedEventManager $sharedEventManager)
{
$this->_sharedEventManager = $sharedEventManager;
}
public function inAction()
{
//...
if (! $isValid) {
$event = new EventManager($this->_sharedEventManager, ['user']);
$event->trigger('log-fail', $this, array('username'=> $username));
//...
}
}
}
很好的解决方案。我的一个小提示是:将
onBootstrap
模块代码放在它自己的LogListener
类中。将关注点很好地分开。在'service\u manager'=>['factories'=>[Listener::class=>ListenerFactory::class]]中注册一个侦听器,
并在配置根键下注册一个侦听器'listeners=>[Listener::class],
(最后一位确保它们被注册和使用)。这很有意义。我试试这个。