@peccul is peccu

(love peccu '(emacs lisp cat outdoor bicycle mac linux coffee))

CakePHPでRoute::mapResources()を利用するときはスネークケースでアクセスする

バックエンドをREST風APIとして実装するためにCakePHPを使っていました。

RESTベースのAPIとしてCakePHPを使っていて、下記の内容に従って実装したところ、controller/:id.jsonの形でアクセスできませんでした。 http://book.cakephp.org/2.0/ja/development/rest.html

エラーの内容は以下のようなものです。 例:  http://domain/api/v1/HogePiyo/1.jsonにアクセス レスポンス:

{ 
    "code": 404, 
    "name": "Action HogePiyosController::1() could not be found.", 
    "message": "Action HogePiyosController::1() could not be found.", 
    "url": "\/cake\/TLessons\/1.json" 
} 

2箇所の修正で解決できました

  1. mapResoucesには規約に従ったコントローラ名を指定する。

app/Config/routes.phpに記載しているmapResourcesに問題がありました。

誤:

Router::mapResources('hogepiyos'); 
Router::parseExtensions(); 

正:

Router::mapResources('hoge_piyos'); 
// 以下でも可 
// Router::mapResources('HogePiyos'); 
// Router::mapResources('hogePiyos'); 
Router::parseExtensions(); 
  1. APIにアクセスする際にスネークケースを利用する。

誤: http://domain/api/v1/HogePiyos/1.json にアクセス

正: http://domain/api/v1/hoge_piyos/1.json にアクセス

Router::mapResources の実装(下記url)を見てわかりました。

https://github.com/cakephp/cakephp/blob/e3b48cdf6f36778484f1345952091ff582a5dc33/lib/Cake/Routing/Router.php#L551

mapResourcesに渡したコントローラ名をスネークケースに変換(Inflector::underscore)したあとに ルーティングの設定をしているので、CamelCaseだとルーティングしてくれないようです。