2015-05-15 2 views
1

Я использую Restful Controller и при определенных условиях хотел бы запустить триггер MvcEvent::EVENT_DISPATCH_ERROR и немедленно прекратить выполнение контроллера. В моем классе Module я подключил прослушиватель событий для этого, но я не могу найти способ его запуска с контроллера представления.ZF2 - Trigger MvcEvent :: EVENT_DISPATCH_ERROR from View Controller

Моего Module код:

public function onBootstrap(MvcEvent $mvcEvent) { 
    $eventManager = $mvcEvent->getApplication() 
     ->getEventManager(); 

    $eventManager->attach(array(MvcEvent::EVENT_DISPATCH_ERROR, MvcEvent::EVENT_RENDER_ERROR), array($this, 'error')); 
} 

public function error(MvcEvent $mvcEvent) { 
    echo $mvcEvent->getError(); 
    die(); 
} 

и мой код Контроллера:

public function indexAction() { 
    $mvcEvent = $this->getEvent(); 

    $mvcEvent->setError('test-error-code'); 
    $mvcEvent->getTarget()->getEventManager()->trigger(MvcEvent::EVENT_DISPATCH_ERROR, $mvcEvent); 
    return; 
} 
+0

Есть ли причина, вы хотите, чтобы вызвать событие против бросать исключение? Исключение вызовет его. –

+0

@TimKlever Да потому, что выбрасываемое исключение является более общим, и я хочу поймать его в определенное время, чтобы вернуть другое сообщение об ошибке. Если я просто проверю ошибку на исключении типа исключения, я получаю только общую ошибку, а не конкретную, которую я действительно хочу. – shiznatix

ответ

1

Я думаю, что проблема в том, что вы не прикрепляться к приложению sharedEventManager. Вы можете также использовать собственный диспетчер событий Controller для запуска события.

попробовать что-то вроде этого:

module.php

public function onBootstrap(MvcEvent $mvcEvent) { 

    $eventManager = $mvcEvent->getApplication()->getEventManager()->getSharedManager(); 

    $eventManager->attach('Zend\Stdlib\DispatchableInterface', MvcEvent::EVENT_DISPATCH_ERROR, array($this, 'error')); 
} 

Контроллер

public function indexAction() { 

    $mvcEvent = $this->getEvent(); 
    $mvcEvent->setError('test-error-code'); 

    $this->getEventManager()->trigger(MvcEvent::EVENT_DISPATCH_ERROR, $mvcEvent); 

    return; 
}