[FuelPHP] ルーティングで正規表現を使ってindexを消す方法

3 min read

かなりニッチな事案かもしれないけれど。

前提

構成

ユーザー画面と管理画面があって、それぞれを別々にしている構成のアプリがあった。 コントローラはこんな感じ。
controller
├─admin
│  └─user
└─users
    └─settings

admin/userという機能には、ユーザーの一覧表示や新規作成、編集機能などがある。他のコントローラとの兼ね合いを考えた時にこの「ユーザー管理」のコントローラはindex.phpとして各アクションにaction_list, action_new, action_editを追加していった。(user/~も同様)

URIの形式

この構成にしたときに困るのがURIでルーティングを設定しないでコイツを呼び出そうとすると、こんな感じになる。
http://localhost/APP/admin/user/index/list

間にコントローラ名の index が入る形で格好悪い。

ルーティングをする

fuel/app/config/routes.phpでルーティングの設定ができる。
前述のコントローラの構成でかつ間にindexを入れないようにする

'admin/user/list' => 'admin/user/index/list',
'admin/user/new'  => 'admin/user/index/csv',
'admin/user/edit' => 'admin/user/index/new',

単純に考えると、こんな感じで設定してやる必要がでてくる。
一応はこれで解決はする。

ルーティングの設定に正規表現を使う

actionの数だけルーティングの行数が増えていくのはつらい。

解決方法は公式ドキュメント(ルーティング)に書いてあった。こいつは正規表現が使えるみたい。
今回のケースだと複雑な正規表現は書かなくて済みそうなので確認してみる。

やや高度なルーティングとあるが、これを使う。難しくはない。

:any - URI の任意の部分にマッチする

'blog/(:any)' => 'blog/entry/$1', // /blog/entry_name が /blog/entry/entry_name に経路付けられる

サンプルを見ると:anyの部分が$1に相当するみたい。

これを踏まえた上で、今回の構成を吸収するように記述すると以下。

'admin/user/(:any)' => 'admin/user/index/$1',

これでactionの数だけ書かないといけなかったルーティングの設定が 1 行で済むようになった。


まだ使うような余地はないけれど、正規表現を使ってもっと汎用的なルーティング設定もできそう。