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以上?だと、正常に動かなかったので、ちょっとだけ修正してあります。