Cakephpで404ページを作るぞい

この記事はだいぶ前に書かれたものなので情報が古いかもしれません

ホームページを見ていると、404ページっていうのがありますよね。Not Foundのページです。

中にはかなり凝ったページもあって見てみるとなかなか面白いんですが、まあ、普通に閲覧している分にはあまり見られることのないページではあります。

あかつきのお宿にも404ページは存在します。個人的にはちょっと頑張ったつもりですが、ま、そんなたいしたレベルではござんせん。

さて、そんな404ページですが、Cakephpで作成する場合、それ用のメソッドなり何なりってのがちゃんと用意されていますので、それをいじって使う感じになります。

それをちょちょいと説明してみたいのですが、バージョン1.3の頃と2.0では若干使い方が違っているみたいなので、順を追って見て行きたいと思います。

ではでは、れっつらごぉ。



1.3ではerror.phpというのを作る

Cakephp1.3以前の場合は、app_controller.phpやapp_model.phpを置く場所に、error.phpというのを作成します。

それからビューの方で404ページ用のテンプレートファイルも用意しておきます。

・app_controller.php
・app_model.php
・views
  ・errors
    ・error404.ctp
・error.php ← これ
・その他のファイル

ざっくりこんな感じですね。

これまたざっくり書きますが、error.phpの中身には『error404』というメソッドを作ります。error404.ctpには当然ながら404ページで表示させたい内容を書く。

//error.php
class AppError extends ErrorHandler {
  function error404($params) {
    //表示用の処理を書く
    
    parent::error404($params);
  }
}

//error404.ctp
<p>お探しのページはあらへんよ。はらぺーにょ。</p>

ちなみに、error404.ctpがどうしてerrorsというフォルダの下に置いてあるのかっていうと、Cakeのコアファイルの中にあるerror.phpを見てもらえば分かるんですけど、そこでviewPathをerrorsってのに設定しているんですね。

どーしてもいじりたいって場合はここを変更すれば良いと思うけど、別に無理矢理変えることはないと思うんで、今回はパス。



レイアウトを変更する

Cakephpってのは、何もしないとレイアウトはdefault.ctpが呼ばれますよね。それはエラーページのときも同じ。

だからこれを別なのにしたければ、コントローラーで処理するときと同じようなことをここでもやる必要があります。

//error.php
function error404($params) {
  $this->controller->layout = 'error';
  parent::error404($params);
}

これでerror.ctpが呼ばれるようになるので、ビューのlayoutsの下にerror.ctpというファイルを作っておきましょう。

このerror.phpでは、$this->controllerにコントローラーの設定が入ってるので、例えばヘルパーを使えるようにしたかったら、こんな感じに書けばオッケーです。

function error404($params){
  $this->controller->helpers = array('Html', 'Form');
}

その他細かいことは/cake/libsの直下にあるerror.phpとか見れば、分かるかもしれないし分からないかもしれない。僕もあまりちゃんとソース見たことないんで、その辺はアバウトで。



モデルを使う

さて、$this->controllerにコントローラーの設定が入ってるんだから、モデルを使いたいならこんなことを書けばできんじゃね? とか思うかもしれません。とりあえず僕は思った。

function error404($params){
  $this->controller->uses = array('User');
  $user = $this->controller->User->find('all');
}

が、しかし。

どうもエラーが出て上手く動かないみたいです。

ではどうするか。

cakephpではclass_registry.phpというファイルがクラスの生成などを行っているみたいなので、直接そこを参照してモデルのインスタンスを作ってしまいます。

function error404($params){
  $user_class = ClassRegistyr::init('User');
  $user = $user_class->find('all');
}

App::import()を使ってモデルのインスタンスを作ることもできますが、とりあえずこんな処理を書けばモデルのメソッドをエラーページのときにも使えるようになります。



2.0ではコントローラーを作る

2.0の場合は、CakeErrorController.phpというファイルを作ってそこでいろいろ処理を行います。

コアの方を見ると、/Cake/Controllerの下にCakeErrorController.phpというファイルがあるので、それをコピーして持って来るのが良いでしょう。

コントローラーなので、やることは普通のコントローラーを書くときと同じです。モデルの処理なんかも通常のコントローラーと同じに扱えるので、1.3よりも楽になっているかもしれませんね。

1.3の頃と同じく呼び出されるビューはView/Errorsの下にあるテンプレートファイルで、レイアウトはdefault.ctpです。

ただ1.3と違うのは、404エラーのときに呼び出されるテンプレートファイルがerror404.ctpではなくerror400.ctpになっている点ですね。よく分からないですけど、404以外の400番台のエラー(401とか403とか)のときも共通で呼び出されるようにとか、そんな感じになっているんですかね。

//CakeErrorController.php
CakeErrorController extends AppController{
  public $name = 'CakeError';
  public $layout = 'error';
  public $uses = array('User');

  public function __construct($request = null, $response = null) {
    parent::___construct($request, $response);
    $user = $this->User->find('all');
  }
}

上ではレウアウトをデフォルトからerror.ctpに変えてます。

コントローラーの作り方に慣れてる分、やっぱり2.0の方が直感的に分かりやすくなったかなって感じはしますね。

1.3でいうところの『error404($params){}』とかは、/Cake/Errorの中にErrorHander.phpとかExceptionRenderer.phpというファイルがあって、その中にメソッドがあるみたいです。なのでこれをapp側にコピーしていじればあんなことやこんなことができるようになるのかな。試してはいないので、もし違ってたらごめんなさい。




今さらながらにして思うんだけど、僕、開発技術のときにざっくりって単語使いすぎだよね? それだけこのお宿自体がざっくりしたサイトってことなんですかね。

まあたぶん、ざっくりって書いとけば、あまりちゃんとした説明じゃなくても「ざっくりっつってるからな……こんなもんか。説明は下手だが炎上させるまでもねー」って読者の人も納得してくれるんじゃないかっていう弱腰な逃げの姿勢が現れてるだけってのが本音だと思いますけどねww

CakePHP で例外・エラー用レイアウトを(プラグインから)変更する | X->A->O 2013年02月08日 02:07:06
[...] [参考] http://norm-nois.com/blog/archives/1027 [...]
もしかしたら何か関連しているかも?