URI路由
一般說來,在URL字串與對應的控制器(controller)類別/方法之間有著一對一的關係。 通常這些在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的第二片段是保留給函數名稱,但是在上例中,它卻含有product ID。 為了克服這個狀況,CodeIgniter允許你重新對應URL handler。
設定你自己的路由規則
路由規則定義在你的application/config/routes.php檔案中。你可以在裡面看到一個叫做$route的陣列,它允許你指定你自己的路由標準。路由可以用萬用字元或是正規式來指定。
萬用字元
一個典型的萬用字元路由看起來會像這樣:
$route['product/:num'] = "catalog/product_lookup";
在一個路由中,陣列的key包含了要被匹配的URI,而陣列值則包含要被重導的目標。 在上例中,如果"product"這個字在URL的第一片段,而且第二片段是數字,則轉而使用"catalog"類別以及"product_lookup"方法。
你可以用文字的值或是兩種萬用字元來匹配:
(:num)將匹配只含有數字的一個片段
(:any)將匹配含有任何字元的一個片段
注意:路由將依照它們定義時的順序執行。較高的路由總是凌駕較低的。
範例
這裡有幾個路由的範例:
$route['journals'] = "blogs";
一個在第一片段包含"journals"這個字的URL,將被重新對應到"blogs"類別。
$route['blog/joe'] = "blogs/users/34";
一個包含"blog/joe"片段的URL,將重新對應到"blogs"類別以及"users"方法。ID將會設定成"34"。
$route['product/(:any)'] = "catalog/product_lookup";
一個在第一片段是"product"而在第二片段是任何值的URL,將重新對應到"catalog"類別以及"product_lookup"方法。
$route['product/(:num)'] = "catalog/product_lookup_by_id/$1";
一個在第一片段為"product"而第二片段是任何數字的URL將重新對應到"catalog"類別以及"product_lookup_by_id"方法,匹配的數字將傳給這個函數作為變數。
非常重要:不要在開頭/結尾使用斜線。
正規式
如果你偏好使用正規式來定義路由規則,任何合法的正規式都允許使用,包括back reference。
注意:如果使用back reference,你必須使用$語法而不是\\語法。
一個典型的正規式路由可能看起來像這樣:
$route['products/([a-z]+)/(\d+)'] = "$1/id_$2";
在上例中,一個像products/shirts/123的URL會轉而呼叫shirts控制器(controller)類別及id_123函數。
你也可以混合且用萬用字元來與正規式匹配。
保留的路由
有兩個保留的路由:
$route['default_controller'] = 'welcome';
這個路由指定在URI裡沒有任何資料時要載入哪個控制器(controller)類別,人們載入根URL時就是這個情況。在上例中,"welcome"類別將被載入。你要儘量有一個預設路由,否則預設會出現一個404頁面。
$route['404_override'] = '';
This route indicates which controller class should be loaded if the requested controller is not found. It will override the default 404 error page. It won't affect to the show_404() function, which will continue loading the default error_404.php file at application/errors/error_404.php.
非常重要:保留的路由必須在任何萬用字元或正規式路由之前。