CakePHPでは基本のURLは /:controller/:action
となりますが、
/XXX/:controller/:action
や /YYY/:controller/:action
の様な構造にしたい場合、
CakePHPがプレフィックスルーティングを用意してくれているようです。
パッと思いついた方法
routes.php
Router::connect('/XXX/', array('controller' => 'pages', 'action' => 'index'));
Router::connect('/XXX/:controller', array('action' => 'index'));
Router::connect('/XXX/:controller/:action/*', array());
Router::connect('/YYY/', array('controller' => 'pages', 'action' => 'index'));
Router::connect('/YYY/:controller', array('action' => 'index'));
Router::connect('/YYY/:controller/:action/*', array());
これでなんとなく実現できている気になっていました。
ですが、デフォルトのルーティングを活かしたままにすると
/XXX/users/detail
で Users
コントローラの detail
アクションにルーティングされますが、
/users/detail
でも同じアクションが実行されてしまいます。
これを抑止するにはCakePHPのデフォルトルーティングを止めなければいけません。
プレフィックスルーティング
config内の core.php
に以下を追記します。
(コメントアウトされているので修正でも大丈夫です。)
core.php
Configure::write('Routing.prefixes', array('XXX', 'YYY'));
routes.php
を触る必要なく、上記設定を行うと以下の様にルーティングされます。
URL | コントローラ | アクション |
---|---|---|
/XXX/users/detail | Users | XXX_detail |
/users/detail | Users | detail |
/YYY/items/list | Items | YYY_list |
/items/list | Items | list |
アクションを実装するメソッドのネーミングルールが変更されますが、
先ほどの様に意図しないルーティングが発生することはありません。
知らなかったのでメモ!