2014-05-18 44 views
0

我試圖在遇到致命錯誤時將用戶重定向到錯誤頁面。我想在onBootstrap方法中做這個重定向,像這樣。當遇到致命錯誤時,重定向到onBootstrap中的錯誤頁面

<?php 
use Zend\Mvc\MvcEvent; 

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

     register_shutdown_function(function (MvcEvent $event) 
     { 
      $response = $event->getResponse(); 
      $response->setHeaders(
       $response->getHeaders()->addHeaderLine('Location', "/error-page") 
      ); 
      $response->setStatusCode(302); 
      $response->sendHeaders(); 
      return $response; 
     });  
    } 
} 
?> 

不過,我得到一個錯誤說:

Catchable fatal error: Argument 1 passed to 
MyException\Module::MyException\{closure}() must be an instance of 
Zend\Mvc\MvcEvent, none given in MyException\Module.php on line 11. 

是否有任何其他方式將用戶重定向?

我也試過這個,但我得到標題已發送錯誤。

register_shutdown_function(function() 
     { 
      ob_clean(); 
      ob_flush(); 
      ob_start(); 
      header ('Location: /'); 
      ob_end(); 
     }); 

任何想法如何解決這個問題?

感謝,

回答

1

試試這個:

public function onBootstrap(MvcEvent $e){ 
    $e->setError('my-custom-error'); 
    $event->getTarget()->getEventManager()->trigger('dispatch.error', $e); 
} 

    public function onDispatchError(MvcEvent $event) 
    { 
     // Do nothing if the result is a response object 
     $result = $event->getResult(); 
     if ($result instanceof Response) { 
      return; 
     } 

     // Common view variables 
     $viewVariables = array(
      'error' => $event->getParam('error'), 
     ); 

     $error = $event->getError(); 
     switch ($error) { 
      case 'my-custom-error': 
       $viewVariables['key'] = $value;     
       break; 
      default: 
       /* 
       * do nothing if there is no error in the event or the error 
       * does not match one of our predefined errors (we don't want 
       * our 403.phtml to handle other types of errors) 
       */ 
       return; 
     } 

     $model = new ViewModel($viewVariables); 
     $model->setTemplate('my-error-page'); 
     $event->getViewModel()->addChild($model); 

     $response = $event->getResponse(); 
     if (!$response) { 
      $response = new HttpResponse(); 
      $event->setResponse($response); 
     } 
     $response->setStatusCode(403); 
    } 
相關問題