Intro
-
example.com/api/v1/hoge
とかapi.example.com/v1/hoge
とかそういうのがやりたい - プラグインとして実装にまとめたい
というわけでごにょごにょ調べたりしたときのメモ。
* * *
- 2015-03-04 続きっぽいの書きました - [メモ] CakePHP で WebAPI っぽいルーティングしたい
Routing する
プラグインっていうと何もしないと example.com/{プラグイン}/{コントローラ}/{アクション}
とかになってしまう。
というわけで対応。
まずはプラグインに配置したルーティング設定が有効になるようにする。
プラグインのロード時に設定しておかないと、プラグインのファイル構成の中に routes.php が存在していてもロードされない。
app/Config/bootstrap.php
で行うプラグインの読み込みコードを次のようにする。
CakePlugin::loadAll(
array(
'MyPlugin' => array('routes' => true)
)
);
app/Plugin/MyPlugin/Config/routes.php
を作る。
ココでは単に、プラグインのほぼデフォルトと同じルーティングに /api/v1
を前置きするだけの設定を行っている。
具体的にどうするかは、アプリケーションの開発戦略によるものなので、そのときどきで検討すること。
詳しくは CakePHP のドキュメントを見ると良い。
$routes = Router::connect(
'/api/v1/:plugin/:controller/:action/:id',
array(),
array('id' => '[0-9]+', 'pass' => array('id'))
);
Ajax 対応のアクションを作る
モデルのデータを検索してきて array -> JSON 文字列として変換して返す。
CakePHP で Ajax 対応メソッドを作るときのプラクティスに従い、$this->autoRender = false;
とするのと、
$this->request->is('ajax')
で Ajax 呼び出しが行われたかどうかを判定している。
class FooController extends MyPluginAppController
{
public function view($id) {
$this->set('id', $id);
return $this->render();
}
public function data($id)
{
if ($this->request->is('ajax')) {
$this->autoRender = false;
return json_encode(
$this->MyPluginModel->findById($id)
);
}
}
}
叩いてみる
アクション foo/view
のビューから foo/data
アクションを叩いてみる。
(暗黙的に jQuery を用いているものとする)
<?php
/* app/Plugin/MyPlugin/View/Foo/view.ctp */
echo $this->Html->scriptStart(array('inline' => true)); ?>
(function ()
{
"use strict";
$(document).ready(function()
{
var id = <?php echo $id; ?>;
$.ajax({
url: '/api/v1/my_plugin/foo/data/' + id,
type: "GET",
success: function (response) {
console.log(response);
},
});
});
})();
<?php echo $this->Html->scriptEnd(); ?>
いっつも思うこと
PHP のビュー変数で JavaScript を記述しているのってすげえダサみあるけど良い方法を知らない。
せめてビューでこうゆう風に書くのなんとかしたい。
CakePHP 公式のドキュメント見たり多少本を読んだりしてもここについて言及したテキストは見当たらなかったけど、みんなどうやってるんだろう。