2012-06-28 15 views
5

私はメンバーをブロックできます。メンバーがブロックされている場合は、それらをカスタムエラーページに送信したいのですが、どうすればzendフレームワークで行うことができますか?私はカスタムエラーページに送信する方法Zend Framework?

throw new Zend_Controller_Dispatcher_Exception('Your message here'); 

を試してみましたが、それは私がこれを行うときには、「ページが見つかりません」と言い、「ここにメッセージを」と言っていません。

ここは私のエラーコントローラです。ここで

<?php 

class ErrorController extends Zend_Controller_Action 
{ 

public function errorAction() 
{ 
    $errors = $this->_getParam('error_handler'); 

    switch ($errors->type) { 
     case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE: 
     case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER: 
     case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION: 

      // 404 error -- controller or action not found 
      $this->getResponse()->setHttpResponseCode(404); 
      $this->view->message = 'Page not found'; 
      break; 

      // 666 error -- controller or action not found 
      $this->getResponse()->setHttpResponseCode(666); 
      $this->view->message = 'Blocked'; 
      break; 
     default: 
      // application error 
      $this->getResponse()->setHttpResponseCode(500); 
      $this->view->message = 'Application error'; 
      break; 
    } 

    // Log exception, if logger available 
    if ($log = $this->getLog()) { 
     $log->crit($this->view->message, $errors->exception); 
    } 

    // conditionally display exceptions 
    if ($this->getInvokeArg('displayExceptions') == true) { 
     $this->view->exception = $errors->exception; 
    } 

    $this->view->request = $errors->request; 
} 

public function getLog() 
{ 
    $bootstrap = $this->getInvokeArg('bootstrap'); 
    if (!$bootstrap->hasPluginResource('Log')) { 
     return false; 
    } 
    $log = $bootstrap->getResource('Log'); 
    return $log; 
} 

} 

ドキュメント、http://framework.zend.com/manual/en/zend.exception.using.htmlは、私はそれを理解していない:(

答えて

8

以下は、動作させるためのヒントです。

まず、エラーを標準no_route/no_controller/no_actionのエラーと区別する必要があります。これを行うには、あなたがPHPのExceptionクラスからこれを拡張することができます(独自のカスタム例外をスローすることができます

throw new My_Exception_Blocked('You are blocked'); 

次に、このように見えるように、エラーコントローラを変更します。

public function errorAction() 
{ 
    $errors = $this->_getParam('error_handler'); 

    switch ($errors->type) { 
     case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE: 
     case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER: 
     case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION: 

      // 404 error -- controller or action not found 
      $this->getResponse()->setHttpResponseCode(404); 
      $this->view->message = 'Page not found'; 
      break; 

     // check for any other exception 
     case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_OTHER: 
      if ($errors->exception instanceof My_Exception_Blocked) { 
       $this->getResponse()->setHttpResponseCode(403); 
       $this->view->message = $errors->exception->getMessage(); 
       break; 
      } 
      // fall through if not of type My_Exception_Blocked 

     default: 
      // application error 
      $this->getResponse()->setHttpResponseCode(500); 
      $this->view->message = 'Application error'; 
      break; 
    } 
} 

私も変更応答コード666から403には6xx HTTPエラーコードがありません。このため、サーバーやクライアントが動揺する可能性があります。

+0

答えていただきありがとうございます!ブロックされたメンバーがこのエラーハンドラでエラーメッセージを受け取るような問題の処理に関して、Cemalの答えはどう思いますか?私はそれを使用するか、別のコントローラを使用してプログラムする必要がありますか? – Darius

+0

アクションヘルパーまたは静的メソッドを呼び出すと、例外がスローされ、エラーコントローラがそれを処理するのと同じくらい簡単になります。デフォルトのErrorHandlerプラグインは404エラーのような特定の例外のみを捕捉するように設計されていますが、あまり複雑すぎないようにしてください。他の条件を処理するために私のエラーコントローラにマイナーな変更を加えましたので、あなたのニーズに合っているかどうか、マニュアルのガイドラインに従い、それを行うヘルパーを実装するだけです。 – drew010

5

をあなたはプログラムによるエラーを管理するために、エラーコントローラプラグインを使用してはならないです。私はどこによコントローラにユーザーをリダイレクトすることをお勧め必要なメッセージを参照してください。Zend Frameworkの中のエラーコントローラの実装が不必要に複雑になっている。あなたはリダイレクトすることで、問題を簡単に解決することができる。

プログラムによるエラーのエラーコントローラも推奨されて使用する。ドキュメントの詳細は怒鳴るです。

Zend_Controller_Plugin_ErrorHandlerは、 のドロップインプラグインを提供します。このプラグインは、コントローラまたはアクションが見つからないことに起因する など、アプリケーションによってスローされた例外を処理します。 の代わりに、MVC例外セクションにリストされているメソッドがあります。

プラグインの主な目標は以下のとおりです。Noルートが原因 方法

  • 発生する例外欠落しているコントローラやアクションに上げ

  • インターセプト例外に一致しない場合に発生

    • インターセプト例外アクションコントローラ内

    つまり、ErrorHandlerプラグインは、HTTPタイプ 404タイプのエラー(ページがない)と500タイプのエラー(内部エラー)を処理するように設計されています。 他のプラグインで発生した例外をキャッチするためのものではありません。

  • +0

    チップをありがとう!私はそれに応じてプログラミングとプログラムでこれを考慮します。 – Darius

    関連する問題