Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在没有错误模板的情况下显示异常引发的flashMessage_Php_Exception_Exception Handling_Zend Framework2 - Fatal编程技术网

Php 如何在没有错误模板的情况下显示异常引发的flashMessage

Php 如何在没有错误模板的情况下显示异常引发的flashMessage,php,exception,exception-handling,zend-framework2,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')); 通过以下

我的服务中出现了一个例外

此异常由以下连接的侦听器处理:

$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());
    }
}
现在,有了这段代码,我如何能够停留在引发异常的同一页面上。我不能在每个异常上显示错误/模板,我必须让我的用户在同一页面上进行confort

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


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

ZF2目前使用
Zend\Mvc\View\Http\RouteNotFoundStrategy
处理404个错误,使用
Zend\Mvc\View\Http\ExceptionStrategy
处理一般异常;因此,您需要以更高的优先级(比
1
)附加事件,以便首先执行它们

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

编辑如果您希望减少代码。我没有对此进行测试,但是如果事件优先级高于
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();
}

谢谢你,这真的很好;我只是不能在每一个引发异常的操作上都这样做,它太重了,而且有很多重复的代码。你有没有办法让它更有效?@Hooli我已经更新了,虽然我没有测试过,所以我会对它是否有效感兴趣。好的,我会给你一个反馈,promis。所以反馈,这段代码起到了作用,但我还不想创建自定义异常,所以我尝试使用\Exception,我有重定向循环,在开发过程中针对我遇到的每个错误。但是如果我们认为这是一件小事,它是有效的。