[メモ] 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');