CodeIgniter 使用手冊版本 2.1.4


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.

非常重要:保留的路由必須在任何萬用字元或正規式路由之前。