2016-08-09 9 views
2

EVENT_DISPATCHリスナー内にスローされた例外を処理する方法はありますか?ZF3/2 - 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"); 
     }); 
    } 
} 

私はJSONなどを返す、403を設定するようForbiddenExceptionにサービスを提供する一般的な方法を持っている...ロジックのすべてがMvcEvent::EVENT_DISPATCH_ERRORリスナーに装着されています。ディスパッチエラーリスナー内のリスナーにForbiddenExceptionを転送するにはどうすればよいですか?ディスパッチリスナーからそれをスローすると、キャッチされない例外エラーが発生します。

これを乗り越える方法はありますか?

答えて

1

イベントをバインドするには、sharedeventマネージャを使用する必要があります。このように:

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 
     } 
    ); 
} 

匿名関数を呼び出したクラスで置き換えることをお勧めします。

1

あなたが正しく理解している場合は、EVENT_DISPATCH_ERRORイベントにアタッチしたリスナーに、発生している例外を処理させます。だけではなく、throw例外をINGのの、あなたはそのパラメータの 1、一度トリガーなど...

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); 
     }); 
    } 
} 

としてあなたの例外のインスタンスにディスパッチエラーイベントを自分でトリガする必要があり、それを行うために

エラーリスナーが例外を引き継いで例外を処理する必要があります

関連する問題