URI ルーティング
通常はURLの文字列と関連するコントローラのクラス/メソッドには一対一の関係があります。URIの中のセグメントは通常下記のようなパターンになっています:
example.com/class/function/id/
しかし、URLが表すものが呼ばれる代わりに、異なるクラス/メソッドが呼ばれるように関連付けを再マッピングしたい場合もあるかと思います。
たとえば、次のような例のURLにしたいとしたとき:
example.com/product/1/
example.com/product/2/
example.com/product/3/
example.com/product/4/
通常は、URLの第2セグメントは、メソッド名として予約されていますが、上の例では、代わりに商品IDになっています。これに対応するため、CodeIgniter ではURIハンドラ [ 訳注: URIに関連付けられたコントローラ/メソッドのこと ] を再マッピングすることが可能です。
ユーザ定義のルーティングを設定する
ルーティング(経路制御)ルールは application/config/routes.php ファイルで定義されています。その中に $route という名前の配列があると思いますが、ここで、ユーザ定義のルーティング条件を指定することができます。ルート(経路)は、ワイルドカードまたは正規表現のどちらかを使って指定できます。
ワイルドカード
ワイルドカードを使った典型的なルート(経路)指定は次のような感じになります:
$route['product/:num'] = "catalog/product_lookup";
ルートの中で、配列のキーは、マッチさせるURIで、一方の配列の値は、再ルート先になります。上の例では、リテラルの"product"がURLの第1セグメントに、数字が第2セグメントにそれぞれ設定されていた場合、"catalog"クラスの"product_lookup"メソッドが通常のルールの代わりに使用されることになります。
リテラル値または次の2種類のワイルドカードを使ってマッチさせることができます:
:num
:any
:num は、セグメントが数字のみを含む場合にマッチします。
:any は、セグメントの中身が、どのような文字列でもマッチします。
Note: ルートは、定義されている順番にもとづいて実行されます。優先度が高いルートが、低いものより常に先に来るようにします。
例
ルーティングについて、いくつか例を挙げます:
$route['journals'] = "blogs";
URL の第1セグメントに "journals" という語を含むURLは、"blogs" クラスに再マッピングされます。
$route['blog/joe'] = "blogs/users/34";
blog/joe というセグメントが含まれるURLは、"blogs" クラスの "users" メソッドに再マッピングされます。ID は "34" にセットされます。
$route['product/:any'] = "catalog/product_lookup";
第1セグメントが "product" 第2セグメントに何かが設定されたURLであれば、"catalog" クラスの "product_lookup" メソッドに再マッピングされます。
$route['product/(:num)'] = "catalog/product_lookup_by_id/$1";
第1セグメントが "product" 第2セグメントに何かが設定されたURLであれば、"catalog" クラスの "product_lookup_by_id" メソッドにマッチした値を変数として再マッピングされます。
重要: マッチさせるワードには、先頭および末尾にスラッシュ ( "/" ) をつけてはいけません。
正規表現
ルーティングルールに正規表現を使うこともできます。正しい正規表現であれば後方参照(戻り参照) のようなものであっても、どんなものも使用できます。
Note: 後方参照(戻り参照)を使うときは、ダブルバックスラッシュ ( "\\" ) を使った構文ではなく、ドル記号 ( "$" ) を使う構文で指定してください。
正規表現を使った典型的なルート指定は次のような感じになります:
$route['products/([a-z]+)/(\d+)'] = "$1/id_$2";
上の例では、products/shirts/123 のようなURIは、通常のルールの代わりに、shirts コントローラクラスのid_123 メソッドが呼ばれます。
また、正規表現にワイルドカードを混在させてマッチさせることもできます。
予約済みのルート
予約済みのルートが2つあります:
$route['default_controller'] = 'welcome';
このルートは URI がデータを含まない時に、どのコントローラを呼ぶべきかを指定するものです。上の例では、"welcome" クラスがロードされます。デフォルトルートは常に設定しておくことをおすすめします。そうしておかないと、デフォルトで404ページが表示されてしまいます。
$route['scaffolding_trigger'] = 'scaffolding';
このルートでは、URL中に出現したときに、スカッフォールディング機能を立ち上げるトリガになる、シークレットワードをセットすることができます。 詳しくはスカッフォールディングのページをお読みください。
Important: 予約済みのルートは、ワイルドカードあるいは正規表現で定義したルートよりも前に来なければなりません。