1

zend フレームワークのカスタム 500 エラー ページを持つことは可能ですか? ErrorController の何かを意味します... 500 エラーがある場合にカスタム ビューのレンダリングを確認します。

<?php
class ErrorController extends Zend_Controller_Action
{
    private $_notifier;
    private $_error;
    private $_environment;

    public function init()
    {
        parent::init();


        $this->_error = $this->_getParam('error_handler');
   }

    public function errorAction()
    {
        switch ($this->_error->type) {
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
                $this->getResponse()->setHttpResponseCode(404);
                $this->view->message = 'Page not found';
                break;
            default:
                //Doesn't work
                $this->renderScript('error/500.phtml');
                $this->getResponse()->setHttpResponseCode(500);
            break;
        }
    }
}
4

1 に答える 1

1

はい、それは完全に可能ですが、そもそもステータス500になる理由によって異なります。

Apache Webサーバーがこのステータスを出力する結果となるものは、ErrorControllerによって簡単に傍受されることはありません。

ただし、特定のアクションをHTTP応答コード500で終了する必要があると判断した場合は、自由に実行できます。

重要なことの1つは、キャッチされない例外をスローすると、Zend Frameworkがそれをキャッチし、エラーコントローラーにリダイレクトすることです。この例外オブジェクトは、「error_handler」パラメーター内のプロパティ「exception」として格納されます。したがって、コードでは、キャッチされていない例外のためにそこにいるかどうかを尋ねることができるはずです。

if (isset($this->_error->exception) && $this->_error->exception instanceof Exception) {
  // You got an exception
}

個人的には、コントローラーが、発行する必要のあるHTTPステータスコードを運ぶController_Exceptionをスローできると判断しました。応答コードの詳細な制御が必要な場合は、コントローラーだけが、問題が発生した場合に応答側で何が起こるかを決定する必要があります。

ロギングについて:エラーが発生した場所にログを記録します。何かが例外をスローする場合、ロギングの正しい場所はスローの直前です。もちろん、いつでもエラーコントローラにログインして、かつては警告レベルでしかなかったエラーが実際にはキャッチされず、実際にはエラーであることを通知できますが、これでは問題がどこで発生したかが実際にはわかりません。

于 2012-11-13T20:35:00.770 に答える