Zend Framework 2 Event Manager

Я узнаю о событиях 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 никогда не производится. Даже я пытался использовать замыкание, как вы можете видеть выше, но это дает мне исключение «Неправильный обратный вызов».

Что я делаю не так. Может кто-нибудь помочь мне в понимании менеджера событий лучше. Спасибо

1

Решение

Ваш подход почти правильный. Проблема в том, что вы присоединяете прослушиватель событий «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)
{

}

}
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector