[FuelPHP] ルーティングで正規表現を使ってindexを消す方法
かなりニッチな事案かもしれないけれど。
前提
構成
ユーザー画面と管理画面があって、それぞれを別々にしている構成のアプリがあった。 コントローラはこんな感じ。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 行で済むようになった。
まだ使うような余地はないけれど、正規表現を使ってもっと汎用的なルーティング設定もできそう。