4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[メモ] CakePHP で WebAPI の実装をプラグイン上に作る

Last updated at Posted at 2015-01-22

Intro

  • example.com/api/v1/hogeとか api.example.com/v1/hoge とかそういうのがやりたい
  • プラグインとして実装にまとめたい

というわけでごにょごにょ調べたりしたときのメモ。

* * *

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 公式のドキュメント見たり多少本を読んだりしてもここについて言及したテキストは見当たらなかったけど、みんなどうやってるんだろう。

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?