cake のエラー処理関連

いくらなんでもユーザがミッシングURLをたたいたときに
Missing Controller の画面がでるのはひどいな。。。
(Debugモードを0にすると今度はデフォルト真っ白だし!)

ということで、エラー画面の修正方法を調査
とりあえず

/cake/libs/error.php

がデフォで行うエラー処理らしい。

エラー処理も
・単にViewを変えるパターン
・エラー処理そのものを変えるパターン
の2種類あるので、まあ、両方調べてみました。

今ある View を変えるだけパターン

render()でviewに渡してる名前を全部リストアップして、
その view を /app/views/errors/ の中にファイルとして作成する。

以下14ファイル(これで全部だと 思う・・)

error404.thtml
missing_action.thtml
missing_component_class.thtml
missing_connection.thtml
missing_controller.thtml
missing_scaffolddb.thtml
missing_fomponent_file.thtml
missing_helper_class.thtml
missing_helper_file.thtml
missing_layout.thtml
missing_model.thtml
missing_table.thtml
missing_view.thtml
private_action.thtml
*Smarty 使ってる人は tpl ですね。

それぞれ適当な内容をかけばOK
たぶんですがDEBUG=0 にしておくと

if (Configure::read() > 0 || $method == ‘error’) {
  call_user_func_array(array(&$this, $method), $messages);
} else {
  call_user_func_array(array(&$this, ‘error404’), $messages);
}

これで全部 error404.thtml にすっとばしてくれるっぽいので、
これだけでもていねいに作った方がいいかな。
(未確認です)

そもそもエラー処理を変えるパターン

/app/error.php を作成する
でこんな感じに適当に処理をかけばOK

class AppError extends ErrorHandler {
  function error($params)
  {
    //DEBUGモードが0かそれ以外かを判別
    if(Configure::read() !== 0){
      return parent::error($params);  //通常通りの処理
    }else{
      $this->controller =& new AppController();  //appcontroller を使えるように
      $this->controller->redirect( “/”, 301 );  //ルートにリダイレクト
    }
  }
}

一応注意としては、 ErrorHandler は Exit してないそうなので
リダイレクトとかならいいですが、 ほかの処理するなら最後に exit しないと
うまく動きません。(error.php を見るとわかりますが、全部メソッド内で exit かけてます)

ここに教えてもらいました: CakePHP cakeError()は値を返さない | Shin x blog

とりあえず自分は 404に全部飛ばそうかな。

Leave a Reply