ZF2 — запуск MvcEvent::EVENT_DISPATCH_ERROR из контроллера представления

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

Мой 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;
}

person shiznatix    schedule 15.05.2015    source источник
comment
Есть ли причина, по которой вы хотите инициировать событие, а не исключение? Исключение вызовет его.   -  person Tim Klever    schedule 15.05.2015
comment
@TimKlever Да, потому что выбрасываемое исключение является более общим, и я хочу поймать его в определенное время, чтобы вернуть другое сообщение об ошибке. Если я просто проверю ошибку в типе исключения, я получу только общую ошибку, а не конкретную, которую я действительно хочу.   -  person shiznatix    schedule 15.05.2015


Ответы (1)


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

Попробуйте что-то вроде этого:

Модуль.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;
}
person Ankh    schedule 15.05.2015