php框架中uri路由机制,URI 路由 — CodeIgniter 3.1.5 中文手册|用户手册|用户指南|中文文档...
URI 路由?
一般情況下,一個 URL 字符串和它對應的控制器中類和方法是一一對應的關(guān)系。
URL 中的每一段通常遵循下面的規(guī)則:
example.com/class/function/id/
但是有時候,你可能想改變這種映射關(guān)系,調(diào)用一個不同的類和方法,而不是
URL 中對應的那樣。
例如,假設你希望你的 URL 變成下面這樣:
example.com/product/1/
example.com/product/2/
example.com/product/3/
example.com/product/4/
URL 的第二段通常表示方法的名稱,但在上面的例子中,第二段是一個商品 ID ,
為了實現(xiàn)這一點,CodeIgniter 允許你重新定義 URL 的處理流程。
設置你自己的路由規(guī)則?
路由規(guī)則定義在 application/config/routes.php 文件中,在這個文件中你會
發(fā)現(xiàn)一個名為 $route 的數(shù)組,利用它你可以設置你自己的路由規(guī)則。
在路由規(guī)則中你可以使用通配符或正則表達式。
通配符?
一個典型的使用通配符的路由規(guī)則如下:
$route['product/:num'] = 'catalog/product_lookup';
在一個路由規(guī)則中,數(shù)組的鍵表示要匹配的 URI ,而數(shù)組的值表示要重定向的位置。
上面的例子中,如果 URL 的第一段是字符串 "product" ,第二段是個數(shù)字,那么,
將調(diào)用 "catalog" 類的 "product_lookup" 方法。
你可以使用純字符串匹配,或者使用下面兩種通配符:
(:num) 匹配只含有數(shù)字的一段。
(:any) 匹配含有任意字符的一段。(除了 '/' 字符,因為它是段與段之間的分隔符)
注解
通配符實際上是正則表達式的別名,:any 會被轉(zhuǎn)換為 [^/]+ ,
:num 會被轉(zhuǎn)換為 [0-9]+ 。
注解
路由規(guī)則將按照它們定義的順序執(zhí)行,前面的規(guī)則優(yōu)先級高于后面的規(guī)則。
注解
路由規(guī)則并不是過濾器!設置一個這樣的路由:'foo/bar/(:num)' ,
Foo 控制器的 bar 方法還是有可能會通過一個非數(shù)字的參數(shù)被調(diào)用
(如果這個路由也是合法的話)。
例子?
這里是一些路由的例子:
$route['journals'] = 'blogs';
URL 的第一段是單詞 "journals" 時,將重定向到 "blogs" 類。
$route['blog/joe'] = 'blogs/users/34';
URL 包含 blog/joe 的話,將重定向到 "blogs" 類和 "users" 方法。ID 參數(shù)設為 "34" 。
$route['product/(:any)'] = 'catalog/product_lookup';
URL 的第一段是 "product" ,第二段是任意字符時,將重定向到 "catalog" 類的
"product_lookup" 方法。
$route['product/(:num)'] = 'catalog/product_lookup_by_id/$1';
URL 的第一段是 "product" ,第二段是數(shù)字時,將重定向到 "catalog" 類的
"product_lookup_by_id" 方法,并將第二段的數(shù)字作為參數(shù)傳遞給它。
重要
不要在前面或后面加反斜線('/')。
正則表達式?
如果你喜歡,你可以在路由規(guī)則中使用正則表達式。任何有效的正則表達式都是
允許的,包括逆向引用。
注解
如果你使用逆向引用,你需要使用美元符號代替雙斜線語法。
一個典型的使用正則表達式的路由規(guī)則看起來像下面這樣:
$route['products/([a-z]+)/(\d+)'] = '$1/id_$2';
上例中,一個類似于 products/shirts/123 這樣的 URL 將會重定向到 "shirts"
控制器的 "id_123" 方法。
With regular expressions, you can also catch multiple segments at once.
例如,當一個用戶訪問你的 Web 應用中的某個受密碼保護的頁面時,如果他沒有
登陸,會先跳轉(zhuǎn)到登陸頁面,你希望在他們在成功登陸后重定向回剛才那個頁面,
那么這個例子會很有用:
$route['login/(.+)'] = 'auth/login/$1';
注解
In the above example, if the $1 placeholder contains a
slash, it will still be split into multiple parameters when
passed to Auth::login().
如果你還不知道正則表達式,可以訪問 regular-expressions.info 開始學習一下。
注解
你也可以在你的路由規(guī)則中混用通配符和正則表達式。
回調(diào)函數(shù)?
你可以在路由規(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 動詞(請求方法),當你在創(chuàng)建 RESTful 應用時特別有用。
你可以使用標準的 HTTP 動詞(GET、PUT、POST、DELETE、PATCH),也可以使用自定義的動詞
(例如:PURGE),不區(qū)分大小寫。你需要做的就是在路由數(shù)組后面再加一個鍵,鍵名為 HTTP
動詞。例如:
$route['products']['put'] = 'product/insert';
上例中,當發(fā)送 PUT 請求到 "products" 這個 URI 時,將會調(diào)用 Product::insert() 方法。
$route['products/(:num)']['DELETE'] = 'product/delete/$1';
當發(fā)送 DELETE 請求到第一段為 "products" ,第二段為數(shù)字這個 URL時,將會調(diào)用
Product::delete() 方法,并將數(shù)字作為第一個參數(shù)。
當然,使用 HTTP 動詞是可選的。
保留路由?
有下面三個保留路由:
$route['default_controller'] = 'welcome';
This route points to the action that should be executed if the URI contains
no data, which will be the case when people load your root URL.
The setting accepts a controller/method value and index() would be
the default method if you don't specify one. In the above example, it is
Welcome::index() that would be called.
注解
You can NOT use a directory as a part of this setting!
You are encouraged to always have a default route as otherwise a 404 page
will appear by default.
$route['404_override'] = '';
這個路由表示當用戶請求了一個不存在的頁面時該加載哪個控制器,它將會覆蓋默認的 404 錯誤頁面。Same per-directory rules as with 'default_controller' apply here as well. show_404() 函數(shù)不會受影響,它還是會繼續(xù)加載 application/views/errors/ 目錄下的默認的 error_404.php 文件。
$route['translate_uri_dashes'] = FALSE;
從它的布爾值就能看出來這其實并不是一個路由,這個選項可以自動的將 URL
中的控制器和方法中的連字符('-')轉(zhuǎn)換為下劃線('_'),當你需要這樣時,
它可以讓你少寫很多路由規(guī)則。由于連字符不是一個有效的類名或方法名,
如果你不使用它的話,將會引起一個嚴重錯誤。
總結(jié)
以上是生活随笔為你收集整理的php框架中uri路由机制,URI 路由 — CodeIgniter 3.1.5 中文手册|用户手册|用户指南|中文文档...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle 快捷 企业,Oracle自
- 下一篇: php保存附件到指定服务器,如何在PHP