CakePHPのエラー処理(cakeError)
CakePHP1.2のエラーハンドリング方法。
Error Handling :: Common Tasks With CakePHP :: The Manual :: 1.2 Collection :: The Cookbook
Object::cakeError()
基本的に、ObjectクラスのcakeErrorというメソッドを使うらしい。
appディレクトリ以下に、error.phpもしくはapp_error.phpというファイルを置いて
ErrorHandlerを継承したAppErrorという名前のクラスを定義すると自分でエラー処理方法を定義できる。
<?php class AppError extends ErrorHandler { function error($params) { // エラー処理 } }
<?php $this->cakeError('error', $params); // AppError::error()をcall
ErrorHandler::__construct()
ここで問題が一つ。
デバッグレベルがゼロの場合に(つまり公開時)、ErrorHandlerのコンストラクタで、
error、error404、error500以外のメソッドが呼べないようになっている。
これは公開時、Missing Controllerなどのエラーを出さないためのよう。
<?php class ErrorHandler extends Object { function __construct($method, $messages) { // 略 if (method_exists($this->controller, 'apperror')) { return $this->controller->appError($method, $messages); } // 略 if ($method !== 'error') { if (Configure::read() == 0){ // Configure::read()はDEBUG_LEVELを返す $method = 'error404'; if (isset($code) && $code == 500) { $method = 'error500'; } } } $this->dispatchMethod($method, $messages); $this->_stop(); }
それ以上エラー出力を分けたい場合には、コンストラクタをオーバーライドするのがよさそう。
また、AppControllerを継承したCakeErrorControllerクラスにappErrorメソッドが定義されていた場合
そちらが優先で呼ばれるので、AppControllerで定義する方法もありかもしれない。
(ただし後者の方法は同じエラーが連続で呼ばれた場合にダメっぽい)