【问题标题】:ZF3/2 - how to catch an exception thrown within EVENT_DISPATCH listener?ZF3/2 - 如何捕获在 EVENT_DISPATCH 监听器中抛出的异常?
【发布时间】:2016-12-15 22:35:25
【问题描述】:

有什么方法可以处理在 EVENT_DISPATCH 侦听器中引发的异常?

class Module
{
    public function onBootstrap(EventInterface $event)
    {
        $application    = $event->getTarget();
        $eventManager   = $application->getEventManager();

        $eventManager->attach(MvcEvent::EVENT_DISPATCH, function(MvcEvent $event) {
            throw new ForbiddenException("403 - Fobidden");
        });
    }
}

我有一种服务ForbiddenException 的常用方式,例如设置403、返回JSON 等...所有逻辑都附加到MvcEvent::EVENT_DISPATCH_ERROR 侦听器。如何将ForbiddenException 传输到调度错误侦听器内的侦听器?从调度侦听器中抛出它会导致未捕获的异常错误...

任何帮助或提示如何克服它都将不胜感激!

【问题讨论】:

    标签: php zend-framework2 zend-framework3


    【解决方案1】:

    您应该使用共享事件管理器来绑定事件。像这样:

    public function onBootstrap(MvcEvent $e)
    {
        $eventManager = $e->getApplication()->getEventManager();
        $moduleRouteListener = new ModuleRouteListener();
        $moduleRouteListener->attach($eventManager);
    
        $sharedManager = $e->getApplication()->getEventManager()->getSharedManager();
        $sm = $e->getApplication()->getServiceManager();
        $sharedManager->attach(
             'Zend\Mvc\Application', 
             'dispatch.error',
             function($e) use ($sm) {
                //Do what you want here
             }
        );
    }
    

    一旦匿名函数像这样工作,我建议用可调用类替换它。

    【讨论】:

      【解决方案2】:

      如果我对您的理解正确,您希望您附加到 EVENT_DISPATCH_ERROR 事件的侦听器来处理您提出的异常。

      为此,您应该使用您的异常实例自己触发调度错误事件,而不仅仅是throwing 异常 它的参数之一,例如...

      class Module
      {
          public function onBootstrap(EventInterface $event)
          {
              $application    = $event->getTarget();
              $eventManager   = $application->getEventManager();
      
              $eventManager->attach(MvcEvent::EVENT_DISPATCH, function(MvcEvent $event) use ($eventManager) {
                  // set some identifier for your error listener to look for
                  $event->setError('forbidden');
                  // add an instance of your exception
                  $event->setParam('exception', new ForbiddenException("403 - Fobidden"));
                  // trigger the dispatch error with your event payload
                  $eventManager->trigger(MvcEvent::EVENT_DISPATCH_ERROR, $event);
              });
          }
      }
      

      一旦触发你的错误监听器应该接管并处理你的异常

      【讨论】:

        猜你喜欢
        • 2018-03-09
        • 2021-11-22
        • 2021-11-03
        • 1970-01-01
        • 2021-10-02
        • 2013-09-14
        • 2021-12-02
        • 2016-02-28
        • 1970-01-01
        相关资源
        最近更新 更多