如何在没有错误模板

时间:2015-04-23 10:30:20

标签: php exception exception-handling zend-framework2

我的服务中有异常。

此异常由附加的侦听器处理:

$this->listeners[] = $events->attach(MvcEvent::EVENT_RENDER_ERROR, array($this, 'handleException'));
$this->listeners[] = $events->attach(MvcEvent::EVENT_DISPATCH_ERROR, array($this, 'handleException'));

处理由flashMessage设计的异常:

public function handleException(MvcEvent $event)
{
    $exception = $event->getParam('exception');
    if ($exception) {
        $flashMessenger = new FlashMessenger();
        $flashMessenger->setNamespace('danger');
        $flashMessenger->addMessage($exception->getMessage());

        $event->getViewModel()->setVariable('flashMessages', $flashMessenger->getMessages());
    }
}

现在,使用此代码,我如何能够保持引发异常的同一页面。我无法在每个例外显示错误/模板,我必须让我的用户保持在同一页面上才能进行配置。

这个问题是这个问题的以下部分:

Handle Exception in ZF2

1 个答案:

答案 0 :(得分:1)

您可以侦听特定错误;如果找到,则可以重定向回同一页面以显示Flash消息。

ZF2目前使用Zend\Mvc\View\Http\RouteNotFoundStrategy执行此操作,执行404错误,使用Zend\Mvc\View\Http\ExceptionStrategy执行常规异常;因此,您需要使用更高优先级(而不是1)附加您的活动,以便首先执行这些活动。

您应该更改控制器代码(来自原始问题)以将异常添加到MVC事件并手动触发调度错误。

修改如果您希望减少代码the dispatch listener does handle exceptions from the controller by triggering the MvcEvent::EVENT_DISPATCH_ERROR for you。我没有对此进行测试,但 应该能够侦听自定义异常,再次提供的事件优先级高于1

public function fooAction()
{
    try {
        throw new \Exception('A error occurred');
    } catch (\Exception $e) {

        // Throw a custom exception
        throw new MyCustomException('Some error');
    }
}

您的事件侦听器现在可以检查并处理重定向。

public function handleException(\Zend\Mvc\MvcEvent $event)
{
    $error = $event->getError();
    $exception = $event->getParam('exception');

    if (! $error || ! $exception instanceof MyCustomException) {
       return;
    }

    $serviceManager = $event->getApplication()->getServiceManager();
    $controllerPluginManager = $serviceManager->get('ControllerPluginManager');

    $flashMessenger = $controllerPluginManager->get('FlashMessenger');

    $flashMessenger->setNamespace('danger');
    $flashMessenger->addMessage($exception->getMessage());

    return $controllerPluginManager->get('redirect')->refresh();
}