業務では使わなかったのですが、JSON型式で返す方法も紹介しておきます。
1. app/Config/routes.php を書き換える
先頭の行に以下を追加します。
Router::parseExtensions('json');
以下のように並べると、xml と json の両方が使えます。
Router::parseExtensions('json','xml');
2. app/Controller/AppController.php を書き換える
RequestHandler コンポーネントを有効にすること、ページングの数を多めにとっておきます。
class AppController extends Controller { public $components = array('RequestHandler'); public $paginate = array( 'limit' => 1000 ); }
3. XML 用の View を作成する
Controller で set した値を json/*.ctp ファイルに書いていきます。作るファイルは XML と同じで、index.ctp, view.ctp, add.ctp, edit.ctp になります。json に変換する場合は、json_encode 関数です。
index.ctp は、配列にします。
$items = array('items'=> array('item'=> $stores)); echo json_encode(array('response'=>$items),JSON_UNESCAPED_UNICODE);
view.ctp, add.ctp, edit.ctp は一つだけの要素を返します。
$item = array('item'=> $store); echo json_encode(array('response'=>$item),JSON_UNESCAPED_UNICODE);
# この部分、なんとか汎用化できないかと思案中。
JSON_UNESCAPED_UNICODE は、マルチバイトを uXXXX 形式にしない、という設定です。こっちのほうがデコードする手間が省けるので。
■実行してみる
一覧の場合は、http://localhost:81/cakephp-2.4.5/Stores.json 、IDを指定して閲覧する場合は http://localhost:81/cakephp-2.4.5/Stores/view/20.json
■おまけ
似た感じでスクリプトも書いておきます。
<?php $views = array( array('adjustmentjobs', 'adjustmentjob'), ... array('stores', 'store'), array('workingsituations', 'workingsituation'), ); foreach ( $views as $v ) { $v0 = $v[0]; $v1 = $v[1]; $json0 =<<< END <?php $items = array('items'=> array('item'=> $$v0)); echo json_encode(array('response'=>$items)); END; mkdir("view/$v0/json"); $path="view/$v0/json/index.ctp"; # print "$json0n"; file_put_contents( $path, $json0 ); $json1 =<<< END <?php $item = array('item'=> $$v1); echo json_encode(array('response'=>$item)); END; # print "$json1n"; file_put_contents( "view/$v0/json/view.ctp", $json1 ); file_put_contents( "view/$v0/json/add.ctp", $json1 ); file_put_contents( "view/$v0/json/edit.ctp", $json1 ); }