AppErrorが自前のエラーメソッドが呼び出されない? ...なんてことはないです

CakeErrorを調べていると、自前で定義したエラーメソッドが呼び出されない、という記事をちらほら見かけます。

cakeError(): 'error'以外のメソッド名は無視される。 - 呆備録
CakePHPのデバッグレベル0の時に$this->cakeError('error500')が404のエラーになる - ほげほげ(仮)
cakeError用メソッド作ってもDEBUG=0だと動かない件 | 自転車で通勤しましょ♪ブログ

どうも昔はどうだったのかわかりませんが、現時点での最新版1.3.11ではもちろんそんなことはありません。

疑惑の部分、cake/libs/error.php __construct()

<?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';
		}
	}
}

読み解けば、debugレベルが0の場合で、さらに親クラスがErrorHandlerでない場合、もしくはErrorHandlerクラスに定義されているメソッドだった場合には、強制的にerror404メソッドにしてます。さらにcodeが500になっていればerror500メソッドに変更しているという、よくわからない実装です。もうちょっと書きようがあるかとは思いますが。

なんにせよ、誤解は誤解、ちゃんと解いておきましょう。そして、CakePHP 2.0への期待を高めましょうw