0

AppControllerに次のコードがあります。これは、404をインターセプトし、事前にコードを実行するために使用しています。今のところ、デバッグ中にすべてを基本に戻しました。

public function appError($error) {
  throw new NotFoundException();
}

例外名はこの時点では無関係です。私の問題は、どの例外をスローしても500エラーが発生することです。

私がやりたいのは、404をスローして404ページを表示することだけです。これは、存在しないURLをアプリに入力した場合に正常に機能します。

私が見逃している何かがこの500を引き起こしていますか?例外エラー500が表示されているだけなので、意味のあるエラーメッセージを受け取ることができません。

4

2 に答える 2

2

appError()自体の内部で例外をスローすると、ループが発生し、ケーキは500エラーでベイルアウトします。

于 2012-10-04T11:45:22.803 に答える
2

修正しました。これが私がしたことです。

ADmadは、私が無限ループを作成していることを親切に指摘したので、次のことを行いました。

/**********************************
/Lib/Error/AppExceptionRenderer.php
***********************************/

App::uses('ExceptionRenderer', 'Error');

class AppExceptionRenderer extends ExceptionRenderer {

    public function error400($error) {
        /***********************
        INSERT MY OWN MAGIC HERE
        ***********************/
        $message = $error->getMessage();
        if (Configure::read('debug') == 0 && $error instanceof CakeException) {
            $message = __d('cake', 'Not Found');
        }
        $url = $this->controller->request->here();
        $this->controller->response->statusCode($error->getCode());
        $this->controller->set(array(
            'name' => $message,
            'url' => h($url),
            'error' => $error,
            '_serialize' => array('name', 'url')
        ));
        $this->_outputMessage('error400');
    }
}

また、これを/Config/core.phpに追加する必要があることもわかりました。

Configure::write('Exception', array(
        'handler' => 'ErrorHandler::handleException',
        'renderer' => 'AppExceptionRenderer',
        'log' => true
));

コンポーネントを含める場合、ADmadを引用するには:

「例外レンダラーには、CakeErrorControllerのインスタンスであるコントローラーへの参照があります。$ this-> controller-> Components-> load()を使用してコンポーネントをロードします。」

于 2012-10-04T13:46:48.910 に答える