Logicky Blog

Logickyの開発ブログです

cakePHP - RequestHandlerとJSONレスポンス

RequestHandler

★RequestHandlerコンポーネント★

RequestHandlerコンポーネントを使うと、クライアントの状態をチェックできる。GETによるアクセスなのか、POSTによるアクセスなのか、Ajaxによるアクセスなのか、などが分かる。

RequestHandlerを使うには、コントローラの$componentsにRequestHandlerを追加する必要がある。

public $components = array('RequestHandler');
$this->RequestHandler->isGet → GETによるアクセスかどうか
$this->RequestHandler->isPost → POSTによるアクセスかどうか
$this->RequestHandler->isSSL → SSL(HTTPS)アクセスかどうか
$this->RequestHandler->isAjax → Ajaxによるアクセスかどうか
$this->RequestHandler->isXml → XMLレスポンスを受け付けるかどうか
$this->RequestHandler->isRss → RSSレスポンスを受け付けるかどうか
$this->RequestHandler->isAtom → Atomレスポンスを受け付けるかどうか
$this->RequestHandler->isMobile → モバイルからのアクセスかどうか

クライアントの状態チェック以外にも使える。例えば、cakePHPのアクションがHTMLではなくJson形式でレスポンスしたいといった場合に、コンテンツの形式を変更できる。

Ajax処理のJSON出力

[CakePHP]Ajax処理のJSON出力を共通化する

というページで、cakePHPでJSON出力する際の便利なコードが書いてある。これを使えば、Ajaxの仕組みを作る度にctpファイルを作るというめんどうな作業がなくなる。ちなみにこのページのコードでは下記でRequestHandlerを使っている。

$this->RequestHandler->setContent('json');
$this->RequestHandler->respondAs('application/json; charset=UTF-8');

このページのコードを使えば、$this->set($data);を使う代わりに、$this->_renderJson($data);を使うだけで、JSON形式で出力できる。あとは、viewでjavascriptのコードを書いて、Ajaxでコントローラーのアクションにアクセスし、ゲットしたJSONを使えばいい。

下記はjavascriptのコード例。jQueryを使っている。#bookSearchをクリックしたらbooksearch()が起動して、#bookSearchTextの内容を./book_searchアクションに渡している。アクションのJSONレスポンスをもとに、#book_infosに本の情報やページ情報を記載している様。

$(function(){
    $('#bookSearch').click(function(){booksearch();});
});

function booksearch_ajax(keyword,page){
 $.ajax({
  type: "POST",
  dataType: "json",
  data: {"keyword":keyword,'page':page},
  url: "./book_search",
  success: function(data){
   if(data != '') {
         $('#book_infos').empty();
          writeBookInfo(data);
          writePage(data);
   }
  }
 });
}

function booksearch(){
 var keyword = $('#bookSearchText').val();
 var page = 1;
 booksearch_ajax(keyword,page);
}