CodeIgniter URI 路由

2018-07-21 15:38 更新

URI 路由

一般情況下,一個(gè) URL 字符串和它對應(yīng)的控制器中類和方法是一一對應(yīng)的關(guān)系。 URL 中的每一段通常遵循下面的規(guī)則:

example.com/class/function/id/

但是有時(shí)候,你可能想改變這種映射關(guān)系,調(diào)用一個(gè)不同的類和方法,而不是 URL 中對應(yīng)的那樣。

例如,假設(shè)你希望你的 URL 變成下面這樣:

example.com/product/1/
example.com/product/2/
example.com/product/3/
example.com/product/4/

URL 的第二段通常表示方法的名稱,但在上面的例子中,第二段是一個(gè)商品 ID , 為了實(shí)現(xiàn)這一點(diǎn),CodeIgniter 允許你重新定義 URL 的處理流程。

設(shè)置你自己的路由規(guī)則

路由規(guī)則定義在 application/config/routes.php 文件中,在這個(gè)文件中你會 發(fā)現(xiàn)一個(gè)名為 $route 的數(shù)組,利用它你可以設(shè)置你自己的路由規(guī)則。 在路由規(guī)則中你可以使用通配符或正則表達(dá)式。

通配符

一個(gè)典型的使用通配符的路由規(guī)則如下:

$route['product/:num'] = 'catalog/product_lookup';

在一個(gè)路由規(guī)則中,數(shù)組的鍵表示要匹配的 URI ,而數(shù)組的值表示要重定向的位置。 上面的例子中,如果 URL 的第一段是字符串 "product" ,第二段是個(gè)數(shù)字,那么, 將調(diào)用 "catalog" 類的 "product_lookup" 方法。

你可以使用純字符串匹配,或者使用下面兩種通配符:

(:num) 匹配只含有數(shù)字的一段。 (:any) 匹配含有任意字符的一段。(除了 '/' 字符,因?yàn)樗嵌闻c段之間的分隔符)

注解

通配符實(shí)際上是正則表達(dá)式的別名,:any 會被轉(zhuǎn)換為 [^/]+ , :num 會被轉(zhuǎn)換為 [0-9]+ 。

注解

路由規(guī)則將按照它們定義的順序執(zhí)行,前面的規(guī)則優(yōu)先級高于后面的規(guī)則。

注解

路由規(guī)則并不是過濾器!設(shè)置一個(gè)這樣的路由:'foo/bar/(:num)' , Foo 控制器的 bar 方法還是有可能會通過一個(gè)非數(shù)字的參數(shù)被調(diào)用 (如果這個(gè)路由也是合法的話)。

例子

這里是一些路由的例子:

$route['journals'] = 'blogs';

URL 的第一段是單詞 "journals" 時(shí),將重定向到 "blogs" 類。

$route['blog/joe'] = 'blogs/users/34';

URL 包含 blog/joe 的話,將重定向到 "blogs" 類和 "users" 方法。ID 參數(shù)設(shè)為 "34" 。

$route['product/(:any)'] = 'catalog/product_lookup';

URL 的第一段是 "product" ,第二段是任意字符時(shí),將重定向到 "catalog" 類的 "product_lookup" 方法。

$route['product/(:num)'] = 'catalog/product_lookup_by_id/$1';

URL 的第一段是 "product" ,第二段是數(shù)字時(shí),將重定向到 "catalog" 類的 "product_lookup_by_id" 方法,并將第二段的數(shù)字作為參數(shù)傳遞給它。

重要
不要在前面或后面加反斜線('/')。

正則表達(dá)式

如果你喜歡,你可以在路由規(guī)則中使用正則表達(dá)式。任何有效的正則表達(dá)式都是 允許的,包括逆向引用。

注解
如果你使用逆向引用,你需要使用美元符號代替雙斜線語法。

一個(gè)典型的使用正則表達(dá)式的路由規(guī)則看起來像下面這樣:

$route['products/([a-z]+)/(\d+)'] = '$1/id_$2';

上例中,一個(gè)類似于 products/shirts/123 這樣的 URL 將會重定向到 "shirts" 控制器的 "id_123" 方法。

使用正則表達(dá)式,你還可以匹配含有反斜線字符('/')的段,它通常來說是 多個(gè)段之間的分隔符。

例如,當(dāng)一個(gè)用戶訪問你的 Web 應(yīng)用中的某個(gè)受密碼保護(hù)的頁面時(shí),如果他沒有 登陸,會先跳轉(zhuǎn)到登陸頁面,你希望在他們在成功登陸后重定向回剛才那個(gè)頁面, 那么這個(gè)例子會很有用:

$route['login/(.+)'] = 'auth/login/$1';

如果你還不知道正則表達(dá)式,可以訪問 regular-expressions.info  開始學(xué)習(xí)一下。

注解
你也可以在你的路由規(guī)則中混用通配符和正則表達(dá)式。

回調(diào)函數(shù)

如果你正在使用的 PHP 版本高于或等于 5.3 ,你還可以在路由規(guī)則中使用回調(diào)函數(shù)來處理逆向引用。 例如:

$route['products/([a-zA-Z]+)/edit/(\d+)'] = function ($product_type, $id)
{
    return 'catalog/product_edit/' . strtolower($product_type) . '/' . $id;
};

在路由中使用 HTTP 動詞

還可以在你的路由規(guī)則中使用 HTTP 動詞(請求方法),當(dāng)你在創(chuàng)建 RESTful 應(yīng)用時(shí)特別有用。 你可以使用標(biāo)準(zhǔn)的 HTTP 動詞(GET、PUT、POST、DELETE、PATCH),也可以使用自定義的動詞 (例如:PURGE),不區(qū)分大小寫。你需要做的就是在路由數(shù)組后面再加一個(gè)鍵,鍵名為 HTTP 動詞。例如:

$route['products']['put'] = 'product/insert';

上例中,當(dāng)發(fā)送 PUT 請求到 "products" 這個(gè) URI 時(shí),將會調(diào)用 Product::insert() 方法。

$route['products/(:num)']['DELETE'] = 'product/delete/$1';

當(dāng)發(fā)送 DELETE 請求到第一段為 "products" ,第二段為數(shù)字這個(gè) URL時(shí),將會調(diào)用 Product::delete() 方法,并將數(shù)字作為第一個(gè)參數(shù)。

當(dāng)然,使用 HTTP 動詞是可選的。

保留路由

有下面三個(gè)保留路由:

$route['default_controller'] = 'welcome';

這個(gè)路由表示當(dāng)用戶不帶任何參數(shù)直接訪問你的網(wǎng)站時(shí)該加載哪個(gè)控制器, 上例中,將會加載 "welcome" 類。你應(yīng)該永遠(yuǎn)都有個(gè)默認(rèn)的路由,要不然 會顯示 404 頁面。

$route['404_override'] = '';

這個(gè)路由表示當(dāng)用戶請求了一個(gè)不存在的頁面時(shí)該加載哪個(gè)控制器,它將會覆蓋 默認(rèn)的 404 錯(cuò)誤頁面。show_404() 函數(shù)不會受影響,它還是會繼續(xù)加載 application/views/errors/ 目錄下的默認(rèn)的 error_404.php 文件。

$route['translate_uri_dashes'] = FALSE;

從它的布爾值就能看出來這其實(shí)并不是一個(gè)路由,這個(gè)選項(xiàng)可以自動的將 URL 中的控制器和方法中的連字符('-')轉(zhuǎn)換為下劃線('_'),當(dāng)你需要這樣時(shí), 它可以讓你少寫很多路由規(guī)則。由于連字符不是一個(gè)有效的類名或方法名, 如果你不使用它的話,將會引起一個(gè)嚴(yán)重錯(cuò)誤。

重要
保留的路由規(guī)則必須位于任何一般的通配符或正則路由的前面。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號