規則路(lù)由是(shì)一(yī)種比較容易理(lǐ)解的(d"×→e)路(lù)由定義方式,采用(yòng)T↕>hinkPHP設計(jì)的(de)規則表達式來(lá ∞i)定義。
規則表達式
規則表達式通(tōng)常包含靜(jìng)态地(dì)址♣¶☆©和(hé)動态地(dì)址,或者兩種地(dì)址的(de)結合,例如(r≤♠>ú)下(xià)面都(dōu)屬于有(yǒu)效的(de)規則表達γ≈$₩式:
'my' => 'Member/myinfo', // 靜(jìng)态地(dì)址路(lù)由'blog/:id' => 'Blog/read', // 靜(jìng)态地(dì)址和(hé)動态地(dì)址結合'new/:year/:month/:day'=>'News/read', // 靜(jìng)态地(dì)址和(hé)動态地(dì)§$址結合':user/:blog_id' =>'Blog/read',// 全動态地(dì)址
規則表達式的(de)定義始終以“/”為(wèi)參數'÷δ(shù)分(fēn)割符,不(bù)受
URL_PATHINFO_DEPR設置的(de)影(yǐng)響
每個(gè)參數(shù)中以“:&rdqu<Ωo;開(kāi)頭的(de)參數(shù)都(d∑">ōu)表示動态參數(shù),并且會(h$ ☆∏uì)自(zì)動對(duì)應一(yī)個('&"gè)GET參數(shù),例如(rú):id表示該處匹配到(dào)的(de)參數(shù)↔✔可(kě)以使用(yòng)$_GET['id']方式獲取,:year、 :month 、:day 則分(fēn)别對(duì)應$_GET['year']、 $_GET['month'] 和(hé) $_GET['day']。
數(shù)字約束
支持對(duì)變量的(de)類型檢測,但(dàn)僅僅支持數(sh♣δφù)字類型的(de)約束定義,例如(rú)
'blog/:id\d'=>'Blog/read',
表示隻會(huì)匹配數(shù)字參數(shù),如(rú)果你(↑>↑nǐ)需要(yào)更加多(duō)的(de)變量類型檢測,♣π¶✘請(qǐng)使用(yòng)正則表達式定義來(lái)₩λ β解決。
目前不(bù)支持長(cháng)度約束,需要(yào)的(de)話(huπ↔≠à)采用(yòng)正則定義解決
函數(shù)支持
可(kě)以支持對(duì)路(lù)由變量的(d→εε e)函數(shù)過濾,例如(rú):
'blog/:id\d|md5'=>'Blog/read',
表示對(duì)匹配到(dào)的(de)σ©∞ id變量進行(xíng)md5處理(lǐ),也(yě)就(jiΩ≤&¥ù)是(shì)說(shuō),實際傳入read操作(zu&♣★ò)方法的(de)$_GET['id'] 其實是(shì) md5($_GET['id'])。
注意:不(bù)支持對(duì)變量使用(yòng)多(duō)次函←€•數(shù)處理(lǐ)和(hé)函數(≥→→ shù)額外(wài)參數(shù)傳入。
可(kě)選定義
支持對(duì)路(lù)由參數(shù)的(de)可(kě)選定義,例如π>∞©(rú):
'blog/:year\d/[:month∑™§\d]'=>'Blog/archive',
[:month\d]變量用(yòng)[ ]包含起來(lái)後£®就(jiù)表示該變量是(shì)路(lù)由匹配的(de "≥)可(kě)選變量。
以上(shàng)定義路(lù)由規則後,下(xià₩§β≤)面的(de)URL訪問(wèn)地(dì)© 址都(dōu)可(kě)以被正确的(de)±↔☆©路(lù)由匹配:
http://serverName/index.php/Ho©>★©me/blog/2013http://serverName/index.php/Home/bπ≠log/2013/12
采用(yòng)可(kě)選變量定義後,之前需要(yào)✘✔±₽定義兩個(gè)或者多(duō)個(gè)路(lù)由規則才能( ¥₹néng)處理(lǐ)的(de)情況可(kě)以合并為(wèi)↔↕一(yī)個(gè)路(lù)由規則。
可(kě)選參數(shù)隻能(néng)放(fàng<&)到(dào)路(lù)由規則的(de)最後,如(Ω≠rú)果在中間(jiān)使用(yòngε¥)了(le)可(kě)選參數(shù)的(de)話(huà),₹∏±♥後面的(de)變量都(dōu)會(huì)變成可(kě)選參數(shù)。
規則排除
非數(shù)字變量支持簡單的(de)排除功能(λ±↑néng),主要(yào)是(shì)起到(dào)避免解析↔♥♥混淆的(de)作(zuò)用(yòng),©Ωε例如(rú):
'news/:cate^add|edit|dele≤<te'=>'News/category'
3.2.2版本開(kāi)始,為(wèi)了(le)避免和(hé)函數(↔∑shù)規則沖突,規則路(lù)由排除分(fēn)隔符改為(wèi)&ldqu↕↕o;-”,所以上(shàng)面的(de)路(lù)由定¶Ω義需要(yào)改為(wèi): 'news↑π÷/:cate^add-edit-delete''®=>'News/category'
因為(wèi)規則定義的(de)局限性,恰巧我們的(de)路(lù)由★←®規則裡(lǐ)面的(de)news和(hé)實±&σ 際的(de)news模塊是(shì)相(xiàng)同的(€φ de)命名,而:cate并不(bù)能(néng)自(zì)動區(qū)分€±(fēn)當前URL裡(lǐ)面的(de)動态參數(shù)是(shì)實際≥✘的(de)操作(zuò)名還(hái)是(shì)路(lù)由變"σ•量,所以為(wèi)了(le)避免混淆,我們需要(y§≥ào)對(duì)路(lù)由變量cate進行(₩☆≥xíng)一(yī)些(xiē)排除以幫助我們進行(xíng)更精确的(d§¥e)路(lù)由匹配,格式^add|edit|delete 表示,匹配除了(le)add edit ♣和(hé)delete之外(wài)的(de)所有(yǒu)λσ₹€字符串,我們建議(yì)更好(hǎo)的(de)方式還(há' ≤÷i)是(shì)改進你(nǐ)的(de)路(lù)由規↓★則,避免路(lù)由規則和(hé)模塊同名的(dλ↑∞e)情況存在,例如(rú)
'new/:cate'=>'News/category'
就(jiù)可(kě)以更簡單的(de)∏£定義路(lù)由規則了(le)。
完全匹配
規則匹配檢測的(de)時(shí)候隻是(shì)對λ$ (duì)URL從(cóng)頭開(kāi)始匹配,隻要(yε ↔ào)URL地(dì)址包含了(le)定義的(de)路(lù)由規則α&就(jiù)會(huì)匹配成功,如(rú)果希望完全匹♣αβ∞配,可(kě)以使用(yòng)$符号,例如(rú):
'new/:cate$'=> 'News/category'
http://serverName/index.>₩£php/Home/new/info
會(huì)匹配成功,而
http://serverName/index.php/Ho¥•"me/new/info/2
則不(bù)會(huì)匹配成功。
如(rú)果是(shì)采用(yòng)
'new/:cate'=> 'News/category'
方式定義的(de)話(huà),則兩種方式的(de)URL訪問π♥←γ(wèn)都(dōu)可(kě)以匹配成€✘功。
完全匹配的(de)路(lù)由規則中如(rú)σ'果使用(yòng)可(kě)選參數(shù≥≠)的(de)話(huà)将會(huì)無¶α 效。




