【小(xiǎo)編推薦】ThinkPHP3.2——實例說( ₩ shuō)明(míng)

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)僅供參<™★考):

  1. namespace Home\Controller;
  2. use Think\Controller;
  3. class NewsController extends Controller{
  4. public function read(){
  5. $New = M('New');
  6. if(isset($_GET['id'])) {
  7. // 根據id查詢結果
  8. $data = $New->find($_GET['id']);
  9. }elseif(isset($_GET['name'])){
  10. // 根據name查詢結果
  11. $data = $New->getByName($_GET['name']);
  12. }
  13. $this->data = $data;
  14. $this->display();
  15. }
  16.  
  17. public function archive(){
  18. $New = M('New');
  19. $year = $_GET['year'];
  20. $month = $_GET['month'];
  21. $begin_time = strtotime($year . $month . "01");
  22. $end_time = strtotime("+1 month", $begin_time);
  23. $map['create_time'] = array(array('gt',$begin_time),array('lt',$end_time));
  24. $map['status'] = 1;
  25. $list = $New->where($map)->select();
  26. $this->list = $list;
  27. $this->display();
  28. }
  29. }

定義路(lù)由規則如(rú)下(xià):

  1. 'URL_ROUTER_ON' => true, //開(kāi)啓路(lù)由
  2. 'URL_ROUTE_RULES' => array( //定義路(lù)由規則
  3. 'new/:id\d' => 'News/read',
  4. 'new/:name' => 'News/read',
  5. 'new/:year\d/:month\d' => 'News/archive',
  6. ),

然後,我們訪問(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ù)由定義改成:

  1. 'URL_ROUTE_RULES' => array( //定義路(lù)由規則
  2. 'new/:year\d/:month\d' => 'News/archive',
  3. 'new/:id\d' => 'News/read',
  4. 'new/:name' => 'News/read',
  5. ),

接下(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ù)由定義改成:

  1. 'URL_ROUTE_RULES' => array( //定義路(lù)由規則
  2. 'new/:id\d$' => 'News/read',
  3. 'new/:name$' => 'News/read',
  4. 'new/:year\d/:month\d$' => 'News/archive',
  5. ),

在規則最後加上(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)↕"規則定義:

  1. 'URL_ROUTE_RULES' => array( //定義路(lù)由規則
  2. '/^new\/(\d+)$/' => 'News/read?id=:1',
  3. '/^new\/(\w+)$/' => 'News/read?name=:1',
  4. '/^new\/(\d{4})\/(\d{2}'σ)$/' => 'News/achive?year=:1&month=:2',
  5. ),