CakePHPでWebAPIを作る事が多くて、そんな中とても重宝して使っているプラグインがあります。

josegonzalez / webservice_plugin GitHub

このプラグインをいれて、ちょちょっと設定して、URLの後ろに .json / .xml と追加してアクセスすれば $this->set() した内容がそのまま構造化されて出力されます。かなり便利。超便利。死ぬほど便利。自前で実装しようとすると意外と面倒なので。

と、これそのままでも良かったんですが、突如JSONPにも対応しなくてはならず、フォークして機能追加&特定のバージョンで動かないバグ修正をしました。

zaru / webservice_plugin GitHub

こちらからダウンロード出来ます。josegonzalezさんに感謝。

JSONPでの出力方法

使い方は非常に簡単で、

http://localhost/hoge/index.json?callback=コールバック名

と、callbackキーをGETで指定してあげればJSONP形式で返ってきます。

WebServicePluginの使い方

GitHubのREADMEにも書かれていますが、簡単に使い方を紹介します。

初期設定

app/Config/bootstrap.php

CakePlugin::load('Webservice');

app/Config/routes.php

Router::parseExtensions('json', 'xml');

コントローラの設定

app/Controller/HogeController.php

<?php
App::uses('AppController', 'Controller');
class WebController extends AppController {
    public $name = 'Web';
    public $uses = array();
    public $components = array(
        'RequestHandler',
        'Webservice.Webservice'
    );

    public function index() {
        $this->set('Items', array('hoge' => 1, 'piyo' => 2));
    }

これで、 http://example.com/web/index.json (or .xml) とアクセスをするとそれぞれのフォーマットで返ってきます。

JSONやXMLでアクセスさせたくないアクションの設定

ブラックリスト機能があります。アクション名を指定することで、そのURLでアクセスされた場合に405ステータスエラーを返します。また、ワイルドカードも使用出来ます。…まぁ使用しないと思いますが。

<?php
//...
    public $components = array(
        'RequestHandler',
        'Webservice.Webservice' => array(
            'blacklist' => array('home', 'index')
        )
    );

出力させたくない変数の設定

アクションと同様に、変数自体も出力しないように設定出来ます。CakePHPが自動でセットしてくるような変数を指定してあげましょう(モデルのバリデーション変数とか)。

<?php
//...
    public $webserviceBlacklistVars = array(
        'Items'
    );

また、このプラグインCakePHP2.2.x以上?だと、正常に動かなかったので、ちょっとだけ修正してあります。



blog comments powered by Disqus