1
1

More than 5 years have passed since last update.

[メモ] CakePHP で WebAPI っぽいルーティングしたい

Posted at

[メモ] CakePHP で WebAPI の実装をプラグイン上に作る からの続きみたいな。この時はプラグインとして書くことでそれっぽい URL にしてみたけど、プラグインの機能の使い方を悪用している気がしたので、別の方法を考えてみた。

やりたいこと

  • Model
    • HogeModel
  • Controller
    • HogesController
    • HogesApiController

こんな感じで、API 用のコントローラと、Webブラウザからのアクセスに応じて、ユーザーの見る画面を提供するコントローラを分けておいて、ブラウザからの /hoges へのアクセスは HogesController::index() へ流して、/api/hoges へのアクセスは HogesApiController::index() に流したいという状態。

ここ とか見てとりあえず Router::mapResources() を使ってみたんだけど、これだと /hoges とかが API へのアクセスとして HogesController::index() に吸われていくので思った通りではない。

結局どうしちゃったのか

結局こんな感じで routes.php に書いてやった。なんかゴリ押し感が半端なくて辛い。もっと良い方法ありそうだけど、一応思った通りのことは出来ているのでメモとして残しておく。

/app/Config/routes.php
Router::parseExtensions();
function connectForAPI ($c) {
  Router::connect(
    "/api/${c}",
    ['[method]' => 'GET', 'controller' => "${c}_api", 'action' => 'index'],
    []
  );
  Router::connect(
    "/api/${c}/:id",
    ['[method]' => 'GET', 'controller' => "${c}_api", 'action' => 'view'],
    ["id" => "[0-9]+"]
  );
  Router::connect(
    "/api/${c}",
    ['[method]' => 'POST', 'controller' => "${c}_api", 'action' => 'add'],
    []
  );
  Router::connect(
    "/api/${c}/:id",
    ['[method]' => 'PUT', 'controller' => "${c}_api", 'action' => 'edit'],
    ["id" => "[0-9]+"]
  );
  Router::connect(
    "/api/${c}/:id",
    ['[method]' => 'DELETE', 'controller' => "${c}_api", 'action' => 'delete'],
    ["id" => "[0-9]+"]
  );
  Router::connect(
    "/api/${c}/:id",
    ['[method]' => 'POST', 'controller' => "${c}_api", 'action' => 'edit'],
    ["id" => "[0-9]+"]
  );
}
connectForAPI('hoges');
1
1
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
1
1