2015年11月1日日曜日

インラインルーティングを使って、fuelphpの動的ルーティングを簡単に設定する方法的なお話

  • このエントリーをはてなブックマークに追加

なんのこっちゃって話だけど、fuelphpのルーティング設定の仕方。
http://hogehoge.com/1みたいな形でとあるテーブルのid=1のデータを表示したいということがある。
その場合はconfig/routes.phpに'(:num)' => 'detail/index/$1'みたいな感じで設定してあげればいい。
この場合は1だからわかりやすいんだけど、http://hogehoge.com/(任意のページ)みたいな形のときは、
'(:any)' => 'detail/index/$1'と書くと、他のページとバッティングするとかそういう問題が出てきてしまう。

で、そのバッティングを封じるには全ページのルーティング内容を表示しないといけないけどそれって面倒。
特にページが増えてしまったときとかはいちいちroutes.phpに設定を書かないといけないのでもう最悪。

ってことで今回はそれでいちいち全ページにルーティングを書かないで済む方法的なお話をば。

とりあえず前提的な話としては下記のような感じ。
・/loginなどの静的ページがいくつか
・とあるテーブルのデータを/(:any)でアクセスした際に表示したい
・/(:any)でアクセスした際にControllerはnameというコントローラーのaction_indexメソッドを使う
・/(:any)はセグメント数不定で/(:any)/1とか/(:any)/hogeとかもあり、indexメソッドに対して引数を渡すこともある

でこれらを満たすためにとりあえずまずはroute.phpの設定をする。

<?php
return array(
  '_root_'  => 'welcome/index',  // The default route
  '_404_'   => '404/index',    // The main 404 route
  'blog/(:any)' => 'blog/entry/$1',
  'contact' => 'contact/form',
  '(:any)' => function(){
    $result = \DB::select()
    ->from("tbl")
    ->where("name","=",\Uri::segment(1))
    ->execute();

    if(count(\Uri::segments()) >= 1 && count($result)){
      return \Request::forge('name/index/'.implode("/",\Uri::segments()),false)->execute();
    }
    else{
      return \Request::forge(implode("/",\Uri::segments()),false)->execute();
    }
  },
);

ってな感じ。
赤字で書かれているところはインラインルーティングってやつ。
無名関数を使ってこの中でデータベースのtblっていうテーブル内に、その名前のデータが存在するかどうか探し、
あったらそれを表示するためのリクエストを作成。
なかったら普通のページに対するリクエストってことで普通のリクエストを作成。
こうしてあげることで、/loginでアクセスしてもちゃんとloginページが表示される。

ちなみに(:any)を一番最後に書く事でその前に書かれているものから優先して処理するみたいな。

インラインルーティングについて書いてる情報とかほとんどないし、
公式ドキュメントもあんまなかったのでちょっと苦労したけど、
これでいちいちroutes.phpを書き足していくっていう面倒な作業から開放されて便利的な。

Adsense