2011-10-01 59 views
6

我有Codeigniter路由的問題。我希望我網站上的所有註冊用戶都擁有自己的「目錄」,例如:www.example.com/username1,www.example.com/username2。這個「目錄」應該映射到控制器「polica」,方法「ogled」,參數「username1」。Codeigniter中的路由 - 自動

如果我這樣做,那麼每個控制器都映射到此路線:「polica/ogled/parameter」。這是不正常:

$route["(:any)"] = "polica/ogled/$1"; 

這工作,但我一直在手動輸入routes.php信息:

$route["username1"] = "polica/ogled/username1"; 

如何做到這一點,這將是全自動的嗎?

更新: 例如,我有控制器名稱ads。例如,如果您訪問www.example.com/ads/ 則會列出廣告。如果您訪問www.example.com/username1,則會列出用戶username1的廣告。還有控制器userprofilelatest,...

我目前routes.php

$route['oglasi'] = 'oglasi'; 
$route['(:any)'] = "polica/ogled/$1" 
$route['default_controller'] = 'domov'; 
$route['404_override'] = ''; 

我解決了問題,這個代碼:

$route['oglasi/(:any)'] = 'oglasi/$1'; 
$route['(:any)'] = "polica/ogled/$1" 
$route['default_controller'] = 'domov'; 
$route['404_override'] = ''; 

問候,馬里奧

+0

輝煌!我只是用默認的控制器做到了這一點,它也在那裏工作。 –

回答

23

的你的路線問題是,通過使用:任何你匹配,實際上......任何路線,所以你幾乎卡在那裏。 我想你可能有兩種解決方法:

1)你可以有選擇地重新路由所有站點控制器獨立,如:

$route['aboutus'] = "aboutus"; 
$route['where-we-are'] = "whereweare"; 
//And do this for all your site's controllers 
//Finally: 
$route['(:any)'] = "polica/ogled/$1"; 

所有這些路線必須來之前的任何,因爲它們在讀它們被呈現的順序,如果你在開始時放置:any,它將愉快地跳過所有其餘的。評論後

編輯:

我的意思是,如果你要來匹配任何部分,這意味着你不能使用在所有的任何控制器(這是在默認情況下,第一個URI段),因爲路由器將始終使用您定義的法則重新路由您。 爲了允許CI執行其他控制器(不管它們是什麼,我只是使用了一些常見的網頁,但可以從字面上理解所有內容),您需要通過從重新路由中排除它們來允許它們。你可以通過將它們放在你的ANY規則之前來實現這一點,這樣每當CI通過你的路由規則時,它首先解析你「逃脫」的路由規則,並且只要它們不匹配它在URL上找到的任何東西,到:任何規則。

我知道這是一個代碼冗長,但他們肯定會少於6K,正如你所說的。 由於我不知道您的網址和網絡應用程序的實際結構,因此這是我想到的唯一解決方案。如果你提供進一步的信息,比如如何塑造了你的應用程序的正規網址,然後我可以更新我的答案

/編輯完

這不是太大的之實踐的解決方案,因爲它需要一個很多代碼,但如果你想要這樣的設計,這是我想到的唯一方法。 另外,考慮到你可以使用正則表達式作爲$ route索引,但是我不認爲它可以在這裏工作,因爲你的用戶名不可能以這種方式匹配,但我只是想指出可能性。

OR

2)您可以沿

$route['user/(:any)'] = "polica/ogled/$1"; 

這行稍微改變你的設計模式,併爲其分配的用戶名另一條路線,事情會產生相當漂亮(和語義)網址儘管如此,並且將避免逃避其他路線的所有麻煩。

+0

謝謝您的回覆。我無法使用你的第二個解決方案,因爲我的客戶希望在域名後面有用戶名。我不明白你的第一個解決方案。你能向我解釋一下我的情況嗎?我的目標是用更少的代碼解決這個問題。現在,我在我的'routes.php'文件中有大約6000行 - 我不喜歡這個:/ – Puzo

+0

@Puzo我更新了我的答案,並解釋了第一個解決方案。是的,6000條路線肯定是太多了。 –

+0

我更新了我的第一個問題。你需要更多的信息嗎?哪一種? – Puzo

1

最近我還在爲這個問題苦苦掙扎。我創建了這樣對我有用的東西:

remap方法定義一個「重定向」控制器。這將允許您將發送到控制器的請求與任何正在進行的變量字符串合併爲一個函數。因此,如果請求http://yoursite/jeff/http://yoursite/jamie它不會擊中這些方法,而是擊中http://yoursite/重映射函數。 (即使這些方法/名稱不存在,即使你有一個索引函數,它也會取代它)。在_Remap方法中,您可以定義一個條件開關,然後與您的其他代碼一起工作,以您想要的任何方式重新指導用戶。

然後,您應該定義此重直控制器作爲默認的和設置您的路線,像這樣:

$route['(.*)'] = "redirect/index/$1"; 
$route['default_controller'] = "redirect"; 

這是起初有點問題​​的,因爲這將基本上強制所有內容被重新 - 無論什麼,最終通過這個_remap開關直接控制這個控制器。

但是你可以做的是定義你不想在這些路由語句之上遵守這個條件的規則/路由。

$route['myroute'] = "myroute"; 
$route['(.*)'] = "redirect/index/$1"; 
$route['default_controller'] = "redirect"; 

我發現,這產生了很好的系統,哪里哪里,我能重定向他們很容易把他們主張通過一個控制器我可以有很多的變量作爲用戶定義。

+0

嗯..所以如果我理解正確,我應該在'routes.php'文件中定義所有的控制器,然後在底部定義重定向規則?影響頁面的性能? – Puzo

+0

@Puzo閱讀您的評論,這幾乎是我想在我的答案中說.. –

+0

@Chamilyan我怎麼可以替換#與/與URL與路由 – Bugfixer

1

另一種方式是聲明數組與intenal控制器和從笨在routes.php文件文件重定向一切像這樣用戶控制器:

$controllers=array('admin', 'user', 'blog', 'api'); 
if(array_search($this->uri->segment(1), $controllers)){ 
    $route['.*'] = "polica/ogled/$1"; 
}