Я узнаю о событиях zf2 и ниже мой код:
module.php
public function init(ModuleManagerInterface $managers) {
$eventManager = $managers->getEventManager();
/* $eventManager->attach('do', array($this, function ($e) {
$event = $e->getName();
$params = $e->getParams();
printf(
'Handled event "%s", with parameters %s',
$event,
json_encode($params)
);
})
); */
$eventManager->attach('do', array($this, 'demoEvent') );
}
public function demoEvent(Event $e) {
echo ' in demo Event';
}
и в функции контроллера я вызвал событие.
$this->getEventManager()->trigger('do', $this, ['aman', 'deep']);
но призыв к действию demoEvent никогда не производится. Даже я пытался использовать замыкание, как вы можете видеть выше, но это дает мне исключение «Неправильный обратный вызов».
Что я делаю не так. Может кто-нибудь помочь мне в понимании менеджера событий лучше. Спасибо
Ваш подход почти правильный. Проблема в том, что вы присоединяете прослушиватель событий «demoEvent» к приложение менеджер событий, а не контроллерМенеджер событий.
Как контроллер, предполагая, что он расширяется AbstractActionController
, также сможет запускать свои собственные события.
Поэтому вам необходимо обновить способ подключения прослушивателя, чтобы он был зарегистрирован в правильном менеджере событий.
Есть несколько вариантов.
Подключите прослушиватели событий внутри фабрики контроллеров. Ты можешь позвонить $controller->getEventManager()->attach();
внутри фабрики, поэтому при создании контроллера всегда подключается прослушиватель событий.
Переопределить attachDefaultListeners()
определены в AbstractActionController
это будет автоматически вызываться, когда контроллер инициализируется диспетчером контроллера. Это обеспечивает доступ к диспетчеру событий контроллеров, просто обязательно не забудьте позвонить parent::attachDefaultListeners()
,
Наконец, вы можете использовать «Shared Event Manager», который на самом деле является просто прокси для целевого менеджера событий (и, несмотря на его имя, а не менеджера событий). Это позволяет вам лишь слегка изменить написанный вами код и сохранить регистрацию прослушивателя событий независимо от контекста запуска (контроллера).
Например.
class Module
{
public function onBootstrap(MvcEvent $mvcEvent)
{
$sharedManager = $mvcEvent->getEventManager()->getSharedManager();
$sharedManager->attach(
'Foo\\Controller\\BarController', // Event manager 'identifier', which one we want
'do' // Name of event to listen to
[$this, 'demoEvent'], // The event listener to trigger
1, // event priority
);
}
public function demoEvent($event)
{
}
}
Других решений пока нет …