2013-12-06 1 views
1

В моем модуле приложения у меня есть прослушиватель событий, он запускается на каждой странице. Взятые из module.php в модуле Application:Ajax вызов не вызывает Zend 2 Событие EVENT_DISPATCH

public function onBootstrap(MvcEvent $e) 
{ 
    $eventManager  = $e->getApplication()->getEventManager(); 
    $eventManager->attach(MvcEvent::EVENT_DISPATCH, array($this, 'authenticate'),1); 
} 
public function authenticate(){ 
    //auth here. This works on every page load except an ajax call 
} 

Javascript:

var adminData={ ... } 
return $.post("/admin/save",adminData); //Will not trigger EVENT_DISPATCH! 

Я проверил, что триггеры событий при каждой загрузке страницы, кроме случаев, когда вызывается JavaScript (AJAX). Если я перейду к ссылке, которую js вызывает (/ admin/save), событие будет срабатывать. Почему событие не запускается при вызове с помощью javascript?

ответ

2

Вам необходимо прикрепить слушателя с более высоким приоритетом, чтобы он срабатывал раньше. Само действие также является прослушивателем событий (onDispatch в AbstractActionController) и прикрепляется в приоритете 1 (см. manual). Попробуйте добавить слушателя в приоритет 2:

$eventManager->attach(MvcEvent::EVENT_DISPATCH, array($this, 'authenticate'),2); 
+0

Успех! Так оно и было. Метод события вызывается перед кодом действия. Но теперь у меня другая ошибка, я пытаюсь использовать форвардный плагин и вижу: Для прямого плагина требуется контроллер, который реализует InjectApplicationEventInterface Это потому, что контроллер еще не создан? –

+0

Хороший вопрос, я не использовал форвардный плагин, и я не уверен, можете ли вы использовать его вне контроллера. Может быть, лучше переадресовать на страницу входа в систему (похоже, это ваш прецедент) –

+0

Как вы перенаправляетесь из модуля? Я попробовал: $ controller = $ e-> getTarget(); return $ controller-> redirect() -> toRoute ("login"); –

0

Хорошо, что событие срабатывает правильно при каждой отправке, даже запросы ajax. Что меня смутило, так это то, что сначала будет выполняться код в методе действий, а затем код в методе в триггере события. Таким образом, у меня была ошибка в коде действия, зависящем от метода, который должно начаться. Каким будет событие для прослушивания для выполнения метода ПЕРЕД код метода действия?

Смежные вопросы