[CakePHP]Ajax処理のJSON出力を共通化する
最近PS3とPSPを買いましたが、モンスターハンターをプレイするのではなくtorneで番組を録って見る用です。tanakaです。
今日はAjaxでよく書く処理を共通化させるコードを紹介します。
CakePHPでJSON出力する
CakePHPでAjax処理を実装するとき、楽に実装できるように次のヘルパーやコンポーネントが用意されています。
- JSON出力に使えるJavascriptヘルパー
- JSON用HTTPヘッダーの送出で使えるRequestHandlerコンポーネント
Ajaxによるリクエストに対してJSONで応答するときは決まった手順で処理するだけなのでそこをひとまとめにしたいと考えます。配列を受け取ってJSONとしてController::render()するメソッドを考えます。必要な処理をAppController::_renderJson()にまとめてみました。
app/app_controller.php
<?php
class AppController extends Controller {
var $components = array(
'RequestHandler',
);
var $helpers = array(
'Javascript',
);
function _renderJson($contents=array(), $params=array()) {
$params = Set::merge(array(
'header' => true,
'debugOff' => true,
), $params);
if ($params['debugOff']) {
Configure::write('debug', 0);
}
if ($params['header']) {
$this->RequestHandler->setContent('json');
$this->RequestHandler->respondAs('application/json; charset=UTF-8');
}
$this->layout = false;
$this->set(compact('contents'));
$this->render('/ajax/json');
}
}
つぎにテンプレートファイルを書きます。
app/views/ajax/json.ctp
<?php
echo $javascript->object($contents);
AjaxControllerはありませんが、通常のコントローラと区別するためにajaxというディレクトリをつくります。
あとは利用するだけ!
ここまでくれば、JSON出力したい場合は、$this->_renderJson($data); とするだけで目的を達成できるようになります。 通常なら個別にレイアウトをOffにしたり、テンプレートを用意することになるので結構楽になると思います。
まとめ
今回はAjax処理を実装するときのJSON出力を共通化しました。実装するときは、RequestHandlerComponent->respondAs() を呼び出す前にdebug=0にしないと、正しくHTTPヘッダーが送出されないので注意が必要です。