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で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); }