log

CakePHP 2.6.2 でエラーコード別にビューを分ける

デフォルトだと 4XX エラーは app/View/Errors/error400.ctp、 5XX エラーは app/View/Errors/error500.ctp が表示されます。

また、Configure::write('debug', 2) のようにデバッグモードを有効にしている場合、 例外クラスに種類に応じてより詳細なビューが使われます。

今回、以下の仕組みを実装します。

  1. デバッグモードを無効にした状態では HTTP ステータスごとにビューファイルを分ける
  2. デバッグモードを有効にした状態ではデフォルトのビューを使う

基本的には http://www.logicsart.com/cakephp/exception-handling-in-cakephp/ の通りにしますが、上記 2 番ができなかったので、少しコードを変更する必要があります。

まずはリンク先のとおりにコードを書いてください。

AppExceptionRenderer クラスの notFound メソッドなどの内容

リンク先のコードはデフォルトの挙動とは少し違うので、デフォルトのコードに合うよう 書き換えます。

$this->controller->beforeFilter();
$message = $error->getMessage();
if (!Configure::read('debug')) {
    $message = __d('cake', 'Not Found');
}
$url = $this->controller->request->here();
$this->controller->response->statusCode($error->getCode());
$this->controller->set([
    'name' => h($message),
    'message' => h($message),
    'url' => h($url),
    'error' => $error,
]);
$this->controller->render('/Errors/error404');
$this->controller->afterFilter();
$this->controller->response->send();

AppExceptionRenderer クラスの missingController メソッドなどの内容

リンク先のコードのだとデバッグモードが有効のときでも error404.ctp などが 使われ、詳細なエラーページが表示されないので以下のように書き換えます。

public function missingController($error) {
    if (!Configure::read('debug')) {
        $this->notFound($error);
    } else {
        $renderer = new parent($error);
        $renderer->render();
    }
}