スマートフォンやhtml5+CSS3など新技術に四苦八苦。jQuery、AjaxなどJavaScriptも難しいですね。そんなWebに悩む人のネタ帳です。

以前に以下のような記事を書きました。
CakePHPで「404 NOT FOUND」などのエラー画面を構築する
こちらで「cakeError」を使用する方法を紹介しましたが、実は欠点があります。
「cakeError」をコールすると、そのコントローラ内の処理が全てキャンセルされるという点です。

私の場合、コントローラ内の「beforeFilter」でレイアウトのヘッダやフッタを構成する処理を実装していたのですが、「cakeError」によりそれらが実行されず、結果的に作成したエラー画面で意図しないシステムエラーメッセージが表示される事態になってしまいました。

「beforeFilter」などに実装した処理を実行させるためには、AppErrorをオーバーライドしたり、コアファイルを修正して「beforeFilter」を実行するように改良する方法があるようです。
しかし、私の場合、エラーが発生する・しないに関わらず、コントローラ毎にベースとして実行する処理は「beforeFilter」にまとめてあるので、なるべくはコアファイルなどに変更をかけずに対策したいと考えてました。

結果としては「cakeError」を使うのを辞めました。

if($a == $b){   // 任意のエラー判定
    $this->cakeError('error404');
}

これまでは上記のように記述していました。
しかし、前述したようにこのままでは実装したプログラムが全てスキップされてしまいます。

そこで、以下のようにすることで実装した処理は活かしたまま目的の画面を表示することができます。

if($a == $b){   // 任意のエラー判定
    $this->render('/errors/error404');
}

「cakeError」は全ての処理をキャンセルしてエラー画面に遷移したい場合に限り使えそうですが、なかなか稀です。また、万が一にエラー時に全ての処理を飛ばしたい場合にも、プログラミングの基礎があればコントローラ内での分岐は容易に実装できます。

そう考えると「cakeError」を使うメリットはないように思われます。

この考え方が正しいかは分かりませんが。
ご参考いただければなによりです。

このエントリーをはてなブックマークに追加

Comment

Comment Form

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Monthly Archives

Search