如何在ZF2中从EVENT_DISPATCH事件中抛出异常

时间:2014-03-12 09:44:52

标签: php zend-framework2 listener

我想从EVENT_DISPATCH事件中抛出异常,该异常处理与从控制器调度方法抛出它时的处理方式相同。但是我不知道怎么做。

在第一段代码中,未捕获异常且未触发EVENT_DISPATCH_ERROR。我尝试使用MvcEvent::setError方法,但没有任何线索。

$this->listeners[] = $events->attach(MvcEvent::EVENT_DISPATCH, array($this, 'onDispatch'), 100);


public function onDispatch(MvcEvent $e)
{
    if ($condition) {
        throw SomeException;
    }
}

class Controller extends AbstractActionController
{
    public function onDispatch(MvcEvent $e)
    {
        if ($condition) {
            throw SomeException;
        }
    }
}

3 个答案:

答案 0 :(得分:1)

<击>     公共函数onDispatch(MvcEvent $ e)     {         if($ condition){             $ e-&gt; getTarget() - &gt; getEventManager() - &gt;触发器(&#39; dispatch.error&#39;,$ e);         }     }

哦,对不起,我的坏,发送。恐怖&#39;只能在发送之前触发,我是在onRoute事件中完成的。

但如果你想在派遣事件中抛出异常试试这个,它对我有用:

重要:优先级应该是此工作的一个关键值

$em->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', array($this, 'onDispatch'), -100);

public function onDispatch(MvcEvent $e)
{
    throw new \Exception('This is Exception');
}

答案 1 :(得分:0)

在Module.php中的

尝试类似的东西

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

    $eventManager->attach( \Zend\Mvc\MvcEvent::EVENT_DISPATCH, array($this,'onDispatch'), 100 );

}

public function onDispatch(MvcEvent $e)
{
    if ($condition) {
        throw SomeException;
    }
}

答案 2 :(得分:0)

我不确定你要做的是100%可能。不过,你可以近距离接触。

问题源于ZF2将控制器异常作为事件处理,事件管理器确定如何处理这些异常。当您从事件管理器本身抛出异常时,它不能以与控制器异常相同的方式处理。

一种可能的解决方案是在php中设置一个全局异常处理程序:

public function onBootstrap( MvcEvent $e )
{
    $eventManager = $e->getApplication()->getEventManager();
    $eventManager->attach( MvcEvent::EVENT_DISPATCH, array( $this, 'onDispatch' ) );

    //set the global exception handler
    set_exception_handler( array( $this, 'handleException' ) );
}

public function onDispatch( MvcEvent $e )
{
    if ( true )
    {
        throw new \Exception();
    }
}

public function handleException( \Exception $e )
{
    //do something with the exception
}

但是,采用这种方法有一些缺点,因为这将覆盖应用程序中所有异常的默认处理,因此您可能只希望它允许它处理特定的异常并让默认处理程序支持其余的,所以:

public function handleException( \Exception $e )
{
    if ( $e instanceof MyExceptionClass )
    {
        //do something with the exception
    }
    else
    {
        //rethrow the exception
        throw $e;
    }
}

有关此内容的更多信息,您可以阅读php docs中的评论:http://php.net/manual/en/function.set-exception-handler.php#usernotes