CakePHPでは基本のURLは /:controller/:action となりますが、
/XXX/:controller/:action や /YYY/:controller/:action の様な構造にしたい場合、
CakePHPがプレフィックスルーティングを用意してくれているようです。
パッと思いついた方法
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 に以下を追記します。
(コメントアウトされているので修正でも大丈夫です。)
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 |
アクションを実装するメソッドのネーミングルールが変更されますが、
先ほどの様に意図しないルーティングが発生することはありません。
知らなかったのでメモ!