2014-10-06 232 views
0

我已經叫控制器「項目」與指數自定義網址

我想的方法傳遞PROJECT_ID 它的工作原理與此網址: 網址:http://example.com/project/index/project_id

什麼,我試圖做的是有網址爲每個項目 http://example.com/project_id 例如: http://example.com/rickyboby

我想這個代碼 $route['(:any)'] = "project/index/$1"; 它的工作,我可以從url www.example.com/project_id訪問project_id,但問題是我有其他控制器現在不工作,例如我有歡迎控制器,網址:www.example.com/welcome/是路由我到項目頁面,我該如何解決?

+0

https://ellislab.com/codeigniter/user-guide/general/routing.html – Brewal 2014-10-06 19:32:02

+0

閱讀有關RESTful路由。 – 2014-10-06 19:32:33

+0

可以通過路由 – Naincy 2014-10-06 19:36:44

回答

2

您需要將「any」規則前的所有控制器列入白名單,因爲它們按順序排列(因此在您的示例中,/welcome會將您帶到project/index/welcome)。例如:

$route['welcome'] = "welcome"; 
$route['somethingElse'] = "someOtherUrl"; 
$route['(:any)'] = "project/index/$1"; 

你也可以試着想用正則表達式這樣做的聰明的方式,但我認爲你是一個白名單更好。


這是一個基本的編程概念,這裏大概不屬於,但你總是可以這樣做:

$controllers = array('welcome', 'otherController', 'etc'); 
foreach($controllers as $c) { 
    $route[$c] = $c; // make all URLs from the list go to their same-named controllers 
} 
$route['(:any)'] = "project/index/$1"; // handle the other URLs 

一兩件事 - 不要忘記,以防止用戶從項目名稱匹配現有的控制器名稱(如welcome),因爲他們的項目將無法訪問!在那裏,還有另一個原因讓該控制器列表在某處...

+1

沒有辦法檢測url之後的字符串是否與存在的控制器名稱相匹配,如果是的話,我們會顯示其他路由到我的項目控制器? – Kamal 2014-10-06 20:08:38

+0

這就是我的答案 - 你需要一個控制器列表(稱爲白名單),並首先檢查它是否是其中的一個,如果不是,則轉到項目控制器。你如何獲得所有控制器的列表? – Shomz 2014-10-06 20:13:37

+1

是否有函數或方法來獲取我所有控制器的列表,我不喜歡對它們進行硬編碼。 – Kamal 2014-10-06 20:16:16

0

在「項目」路由規則之前放置「welcome」路由規則。這樣系統將迎合歡迎,不會去尋找下一個規則。或者,您可以使用(:num)而不是(:any),這樣它將只匹配數字(如果您的項目ID是數字)。

+0

我的項目ID是一個字符串,我應該爲每個控制器添加一個路由嗎?沒有辦法檢測url之後的字符串是否與控制器名稱相匹配,以顯示它是否路由到我的項目控制器? – Kamal 2014-10-06 19:55:26