読者です 読者をやめる 読者になる 読者になる

ほげほげ(仮)

仮死状態

CakePHPのデバッグレベル0の時に$this->cakeError('error500')が404のエラーになる

PHP


CakePHPのお話です

現象

$this->cakeError('error500')がデバッグレベル0の時に何故か404のエラーになってしまう現象があります。
デバッグレベルが0以外の時は問題ないんですが。

原因

色々と調べたらcake/libs/error.phpにあるErrorHandlerのコンストラクタで問題がありました。
一部抜粋

<?php
if ($method !== 'error') {
    if (Configure::read('debug') == 0) {
        $parentClass = get_parent_class($this);
        if (strtolower($parentClass) != 'errorhandler') {
            $method = 'error404';
        }
        $parentMethods = array_map('strtolower', get_class_methods($parentClass));
        if (in_array(strtolower($method), $parentMethods)) {
            $method = 'error404';
        }
        if (isset($messages[0]['code']) && $messages[0]['code'] == 500) {
            $method = 'error500';
        }
    }
}
?>

解決策

ググったら下のを見つけました
CakePHP - DEBUG=2: My error500 shows; DEBUG=0: I get "not found". --psybear


で、そのなかのリンクを辿ったら次のようにすればいいっぽいです。


app/app_error.phpを作成し、次のようにします。

<?php
class AppError extends ErrorHandler {
    function __construct($method, $messages) {
       Configure::write('debug', 1);
       parent::__construct($method, $messages);
    }
}
?>

これだけです。


ErrorHandlerクラスを拡張してコンストラクタを呼ぶ前にデバッグレベルを1に変更しています。

とりあえず、これでcore.phpデバッグレベルが0の場合でも500のエラーが出力されます。