
2014-06-26 |&σ✘σnbsp; 發布者:梁國(guó)芳&nb "sp; | ♦↔× 查看(kàn):3320次
Thinkphp我們已經了(le)解了(le)如(rú)何定義∞≤路(lù)由規則,下(xià)面我們來(↔≥>εlái)舉個(gè)例子(zǐ)加深印象。
假設我們定義了(le)News控制(zhì)器(qì)如("€rú)下(xià)(代碼實現(xiàn)僅供參<™★考):
namespace Home\Controller;use Think\Controller;class NewsController extends Controller{public function read(){$New = M('New');if(isset($_GET['id'])) {// 根據id查詢結果$data = $New->find($_GET['id']);}elseif(isset($_GET['name'])){// 根據name查詢結果$data = $New->getByName($_GET['name']);}$this->data = $data;$this->display();}public function archive(){$New = M('New');$year = $_GET['year'];$month = $_GET['month'];$begin_time = strtotime($year . $month . "01");$end_time = strtotime("+1 month", $begin_time);$map['create_time'] = array(array('gt',$begin_time),array('lt',$end_time));$map['status'] = 1;$list = $New->where($map)->select();$this->list = $list;$this->display();}}
定義路(lù)由規則如(rú)下(xià):
'URL_ROUTER_ON' => true, //開(kāi)啓路(lù)由'URL_ROUTE_RULES' => array( //定義路(lù)由規則'new/:id\d' => 'News/read','new/:name' => 'News/read','new/:year\d/:month\d' => 'News/archive',),
然後,我們訪問(wèn): http://serverName/index.php/Hom±♥e/new/8
會(huì)匹配到(dào)第一(yī)個(gèδ¥&✔)路(lù)由規則,實際執行(xíng)的∞(de)效果等效于訪問(wèn): http://serverName/index.php/Home/News/r≤≤π≈ead/id/8
當訪問(wèn): http://serverName/index.ph→♦p/Home/new/hello
會(huì)匹配到(dào)第二個(gè)路(lù)由規則, ♠<實際執行(xíng)的(de)效果等效于訪∑β問(wèn): http://serverName/inde₹♥£x.php/Home/News/read/name/he→&¥llo
那(nà)麽如(rú)果訪問(wèn): http://serverName/in™€"dex.php/Home/new/2012/03
是(shì)否會(huì)匹配第三個(gè)路(lù)由規則呢€∏↕(ne)?我們期望的(de)實際執行(xíng)的(de)效果能£↕§ (néng)夠等效于訪問(wèn): http://serverName/inde ♣x.php/Home/News/archive/yea₽≥r/2012/month/03
事(shì)實上(shàng)卻沒有(yǒu),因為(w↓→↓&èi)http://serverName/index.php/Homeσα&/new/2012/這(zhè)個(gè)URL在進行(xín∞↕εg)路(lù)由匹配過程中已經優先匹配到(dγ ₹≤ào)了(le)第一(yī)個(gè)路(lù♥'©♥)由規則了(le),把2012當成id的(de)值傳入了(le),這(zhè'®↕)種情況屬于路(lù)由規則的(de)沖突,解決辦法有(yǒu)兩<→∞δ個(gè):
1、調整定義順序
路(lù)由定義改成:
'URL_ROUTE_RULES' => array( //定義路(lù)由規則'new/:year\d/:month\d' => 'News/archive','new/:id\d' => 'News/read','new/:name' => 'News/read',),
接下(xià)來(lái),當我們再次訪問(wèn): http://serverName/index.php/Home/new≠•✘₩/2012/03
的(de)時(shí)候,達到(dào)了(le)預期的(de§∏ )訪問(wèn)效果。所以如(rú)果存在可(kě)能(néng)規則φ"φ沖突的(de)情況,盡量把規則複雜(zá)的(de)規則定義放(fàng≈)到(dào)前面,确保最複雜(zá)的(d₩☆e)規則可(kě)以優先匹配到(dào)。但(dàn)∑∏ 是(shì)如(rú)果路(lù)由規則定義多(duδ♥βō)了(le)之後,仍然很(hěn)容易混淆,所π σ≈以需要(yào)尋找更好(hǎo)的(de)解決辦法。
2、利用(yòng)完全匹配功能(néng)
現(xiàn)在我們來(lái)利用(yòng)路(lù)由的(de)完全匹×<¶•配定義功能(néng),把路(lù)由定義改成:
'URL_ROUTE_RULES' => array( //定義路(lù)由規則'new/:id\d$' => 'News/read','new/:name$' => 'News/read','new/:year\d/:month\d$' => 'News/archive',),
在規則最後加上(shàng)$符号之後,表示完整匹配當前的(d<γ<e)路(lù)由規則,就(jiù)可(kě)以避免規則定義的(de€↕×")沖突了(le)。對(duì)于規則路(lù)由來(lái)說(shuō),簡₽₩γ單的(de)理(lǐ)解就(jiù)是(shì)URL裡(lǐ)面的(de) →參數(shù)數(shù)量或者類型約束要(yào)完全一(yī)緻。 $×≥γ所以,如(rú)果我們訪問(wèn) http://serverName/index.php/H≠÷£ome/new/2012/03/01
的(de)話(huà),是(shì)不(bù)會(huì)匹配÷ £成功任何一(yī)條路(lù)由的(de)。
3、利用(yòng)正則路(lù)由
當然,解決問(wèn)題的(de)辦法總>₩是(shì)不(bù)止一(yī)種,對(duì)于複↔¶→γ雜(zá)的(de)情況,我們不(bù)要(yào)忘了(l✔×e)使用(yòng)正則路(lù)由規則定義,在你(nǐ)找不(bù)β≠♠到(dào)解決方案的(de)時(shí)候,正則路(lù)由總能(né®♣∏←ng)幫到(dào)你(nǐ)。 要(yào)實現(xiàn)上(shànσ<∏g)面的(de)同樣路(lù)由功能(néng)的(de)∏∏β話(huà),還(hái)可(kě)以用(yòng)下(xià)面的(de)↕"規則定義:
'URL_ROUTE_RULES' => array( //定義路(lù)由規則'/^new\/(\d+)$/' => 'News/read?id=:1','/^new\/(\w+)$/' => 'News/read?name=:1','/^new\/(\d{4})\/(\d{2}'σ)$/' => 'News/achive?year=:1&month=:2',),
