2016-06-14 73 views
3

我想補充的錯誤處理module.php添加所有錯誤消息閃光燈Messenger和重定向到一個特定的頁面(在我的要求):如何訪問module.php中的控制器插件,而不使用ZF2中的任何控制器對象..?

public function handleError(MvcEvent $e) { 
     $exception = $e->getParam('exception'); 
     $controller = $e->getTarget(); 
     //echo $exception->getMessage(); exit; 
     if (!$e->getApplication()->getServiceManager()->get('AuthService')->hasIdentity()) { 
      $controller->flashMessenger()->addErrorMessage("Session Expired..!!"); 
      return $e->getTarget()->plugin('redirect')->toRoute('auth', array('action' => 'login')); 
     } 

     switch ($exception->getCode()) { 
      case "2003" : 
       $controller->flashMessenger()->addErrorMessage("Unable to connect database..!!"); 
       break; 

      default : 
       $controller->flashMessenger()->addErrorMessage($exception->getMessage()); 
       break; 
     } 

     $e->getApplication()->getServiceManager()->get('AuthService')->clearIdentity(); 
     return $e->getTarget()->plugin('redirect')->toRoute('auth', array('action' => 'login')); 
    } 

但在一些錯誤的投擲呼籲對$e->getTarget()未定義的方法插件因爲在某些情況下,插件綁定之前會生成錯誤。我想要一種訪問redirect and flash messenger plugins的方式,而不用引用任何控制器。

回答

4

試圖對谷歌定義的許多方面,我發現下面的方式工作:

public function handleError(MvcEvent $e) { 

     $exception = $e->getParam('exception'); 
     $sm = $e->getApplication()->getServiceManager(); 
     $flashmessenger = $sm->get('ControllerPluginManager')->get('flashmessenger'); 
     //echo $exception->getMessage(); exit; 
     if (!$e->getApplication()->getServiceManager()->get('AuthService')->hasIdentity()) { 
      $flashmessenger->addErrorMessage("Session Expired..!!"); 
      return $sm->get('ControllerPluginManager')->get('redirect')->toRoute('auth', array('action' => 'login')); 
     } 

     switch ($exception->getCode()) { 
      case "2003" : 
       $flashmessenger->addErrorMessage("Unable to connect database..!!"); 
       break; 

      default : 
       $flashmessenger->addErrorMessage($exception->getMessage()); 
       break; 
     } 

     $e->getApplication()->getServiceManager()->get('AuthService')->clearIdentity(); 
     return $sm->get('ControllerPluginManager')->get('redirect')->toRoute('auth', array('action' => 'login')); 
    } 

我已經張貼在這裏,這些解決方案使之能救別人的時間中再次搜索相同。