2

讓我們假裝我正在努力學習CI,並且作爲我的測試項目,我正在構建一個團購網站。MVC - URI中沒有控制器?

我想的是讓每個城市不同的頁面,如:

http://www.groupon.com/las-vegas/ 
http://www.groupon.com/orlando/ 

我也想有不同的頁面,例如:

http://www.groupon.com/learn 
http://www.groupon.com/contact-us 

如果我在CI中構建並遵循MVC思想,這將如何工作?我有很難看到如何完成所需的URL與概念:

http://www.domain.com/controller/view/segment_a/segment_b/etc... 
+1

重新映射我應該看的地方? http://codeigniter.com/user_guide/general/controllers.html#remapping – 2011-03-17 22:08:53

回答

2

我會做的是創建一個自定義404控制器,作爲一個包羅萬象的不存在的路線。

它將採取的URI,可能對其進行驗證,並且它重新路由到(例如)「城市」控制器。

如果城市控制器無法找到城市(無論是指定的字符串),那麼它需要發出適當的404,否則,你就可以顯示你的信息,該城市。

而且,一旦你創建自定義404控制器,你可以通過指定一個名爲「404_override」路線把所有404錯誤吧。

1

這就是URI Routing進來,但在你的情況,你可能將不得不小心定義你的路由作爲第一和只有部分路線已經是可變部分。

1

這實際上與MVC無關,還有更多關於良好URL的內容。

你要找的是雙方的URL(一)但從用戶的角度和明確的(b)該給的提示,你的應用程序,以它是如何打算處理。

我會做什麼在這種情況下略微重新設計你的URL,這樣,而不是:

http://www.groupon.com/las-vegas/ 
http://www.groupon.com/orlando/ 

你將不得不網址看起來像這樣:

http://www.groupon.com/destinations/las-vegas/ 
http://www.groupon.com/destinations/orlando/ 

位開頭 - /destinations/ - 可以被你的URL路由代碼用來決定哪個控制器應該處理它。如果您的路由代碼是基於URL的,你可能有一個這樣的數組:

$routes = array(
    '/destinations/' => 'on_destination_list', 
    '/destinations/(.+)' => 'on_destination', 
    '/(.*)' => 'on_page'); 

// Basic URI routing code based off of REQUEST_URI 
foreach ($pattern => $func) { 
    if (preg_match("`^$pattern$`", $_SERVER['REQUEST_URI'], $placeholders)) { 
     array_shift($placeholders); 
     call_user_func($func, $placeholders); 
    } 
} 

請記住,我寫的路由代碼了我的頭頂部,它可能不完全正確的。它應該給你你需要做的事情的要點。

這樣做,讓有額外的好處,如果有人去http://www.groupon.com/destinations/,你將有機會展示目的地的列表。

+0

非常感謝這篇精彩的文章,但我確實希望在URI中沒有控制器。這些都是我的問題中真正的羣組頁面,我認爲這是最有意義的。 – 2011-03-17 22:40:25

+1

我不是真的直接映射到控制器。我已經加入了這個例子來說明這一點。另一種方法是,你首先捕獲你想要路由的URI路徑,比如'/ learn'和'/ about-us',對於任何現有路由不匹配的路徑,將它們視爲目標名稱。這一切都歸結爲相同的事情,但URI的設計不同。 – 2011-03-17 22:48:57

+0

是的,這很有意義,+1 – 2011-03-17 22:57:16