2014年6月25日水曜日

fuelphpで404のときにレスポンスコードでちゃんと404を返す方法的なお話

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

fuelphpはフレームワークなだけあって中々便利なもので、
Controllerには通常のものやRest、Templateなんてものがある。
Ruby on Railsに似てるからRoutesなんてものもあったりで、
軽量で自由も聞くしCodeigniter使ってた人もよく使っていたりする。

で、今回はそんなfuelphpにてContoller_Templateを継承したBaseコントローラーを継承した404コントローラーにて、
どうやって404のレスポンスコードを返すかというお話。
ちゃんと404のレスポンスコードを返さないとSEO的なお話であまりよくないとかもあるし、
ちょっとこれを応用すれば他のページで独自のレスポンスコードを返したりも出来るという。

ということでざくっと解説をば。

とりあえずContoller_Templateを継承したController_Baseを用意

class Controller_Base extends Controller_Template{
  /* template */
  public $template = 'base-template';

  public function before(){
    parent::before();
  }

  public function after($response){
    $response = parent::after($response);

    if($this->response_status == "404"){
      //404の場合の処理
    }
    else{
      //404以外での処理
    }

    return $response;
  }
}
beforeで何かログイン処理だとかやってみたりして、
描画する前にafterで404とかを分けたりなんだり。
基本的にはどの画面でも処理を共通にしたいのでこういった設計にしている。

で、次はこのController_Baseを継承したController_404を用意
class Controller_404 extends Controller_Base{
  public function action_index(){
    $this->response_status = "404";//これが重要
    $this->template->view = View::forge('404');
  }
}
ちなみにRoutesで404の場合は、URLを変えずにController_404を呼び出す形となっている。
$this->response_status = "404"を挿入しないとこのままだと200で返ってきてしまうし、
継承しているafter内にて分岐処理を対処出来なくなってしまう。

ってことで早い話が任意のタイミングで404なり200なりレスポンスコードを変更したいのであれば、
$this->response_status = "xxx"とController内で書いてあげれば大丈夫だったりする。

/public/index.phpの部分を書き換えるなり、
そもそも404検知したならば/404にリダイレクトすればいいじゃんって話ではあるけれども、
個人的にはURLを変えずに404のレスポンスを返してあげた方がいいんじゃないかと。
特に/hoge/xxxxが存在しないのであれば、/hoge/内のどこかにいきたいんだろうなってことで、
/hoge/内のコンテンツを表示してあげることによって離脱を防ぐとかってことも出来るだろうし。

Adsense