CakePHPのWeb APIレスポンスをJSON型式で返す

業務では使わなかったのですが、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 );
}
カテゴリー: CakePHP, WPF パーマリンク