業務では使わなかったのですが、JSON型式で返す方法も紹介しておきます。
1. app/Config/routes.php を書き換える
先頭の行に以下を追加します。
1 | Router::parseExtensions( 'json' ); |
以下のように並べると、xml と json の両方が使えます。
1 | Router::parseExtensions( 'json' , 'xml' ); |
2. app/Controller/AppController.php を書き換える
RequestHandler コンポーネントを有効にすること、ページングの数を多めにとっておきます。
1 2 3 4 | 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 は、配列にします。
1 2 | $items = array ( 'items' => array ( 'item' => $stores )); echo json_encode( array ( 'response' => $items ),JSON_UNESCAPED_UNICODE); |
view.ctp, add.ctp, edit.ctp は一つだけの要素を返します。
1 2 | $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
■おまけ
似た感じでスクリプトも書いておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | <?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 ); } |