2011-06-03 75 views
2

我的應用程序旨在爲每個用戶提供一個簡檔頁面,第三個分段是用戶的ID。CodeIgniter動態URI路由可能嗎?

example.com/profile/page/1 

假設用戶1爲「喬恩·喬維」,使用CI的路由我想生成該URI

example.com/jon_jovi 

是否有可能該用戶的ID發送給config/routes.php,運行一個函數來提取用戶從數據庫1的信息,並插入它像

$route['profile/page/$row->id'] = $row->first_name . '_' . $row->last_name; 

如何做到這一點是非常讚賞的任何想法或建議 - 謝謝。

回答

4

如果您希望「客戶端」url格式爲base_url/[username],那麼您很可能需要抓取用戶名一些正則表達式路由,例如$route['([a-zA-z_]+)'] = "profile/page/$1";,然後查看數據庫中的該用戶。

另一種解決方案是將id附加到url,如base_url/[username]/[id]。爲此,正則表達式$route['([a-zA-z_]+)/([0-9+])'] = "profile/page/$2";將傳遞該id作爲Profile控制器頁面函數的第一個參數。

檢查動態路由的詳細信息的文檔:http://codeigniter.com/user_guide/general/routing.html

+0

謝謝@ julio,但數據庫查找的位置在哪裏?這將在routes.php中調用其他地方的函數/模型嗎?如果你有時間做一個很棒的例子。 – pepe 2011-06-03 17:17:38

+0

@torr使用第一個路由,如果你訪問'base_url/foo',它會調用'Profile'控制器的'page'功能。用戶名(在本例中爲foo)將作爲函數的第一個參數傳遞。 – JulioC 2011-06-03 18:05:09

5

不知道這需要在你的config/routes.php:爲什麼你不只是創建一個名稱和查找控制器?

編輯:我把它收回。實際上這實際上有點痛苦,特別是因爲你希望它活在域名的根目錄上(例如,它很容易做example.com/p/{username},但example.com/{username }是凌亂的)。

最簡單的方法是使用CodeIgniter 2.0 +的能力來覆蓋404處理函數和_remap函數。首先,在的config/routes.php文件文件做到這一點:

$route['404_override'] = 'notfound'; 

然後創建控制器:

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class NotFound extends CI_Controller 
{ 
    function __construct() 
    { 
    parent::__construct(); 
    } 

    public function _remap($method) 
    { 
    if($this->uri->total_segments() == 1){ 
     // try it out 
     $this->profile(); 
    }else{ 
     show_404($this->uri->uri_string()); 
    } 
    } 

    function profile() 
    { 
    echo "Showing profile for [" . $this->uri->segment(1) . "]"; 
    } 
} 

你必須落實404頁,因爲這將覆蓋它的觀點,但任何未映射到現有控制器的請求都會進入此處,並且您可以根據需要分派它們,包括將名稱轉換爲數據庫標識。

讓我知道,如果這對你有用。

+0

謝謝@femi - 你有什麼建議嗎?是否可以使用CI中的動態名稱命名控制器功能? – pepe 2011-06-03 04:16:30

+0

非常整潔的解決方案。我已經用_example.com/p/{id}_結束了幾次,因爲我無法弄清楚如何放棄控制器,這樣做從來沒有想過。下次我一定會記住這一點。 – danneth 2011-06-03 07:29:19

+0

這沒有任何意義......我認爲這太簡單了。按照Julio的例子,使用路線是一個更好的做法。 – tpae 2011-06-03 14:25:07

0

也有類似問題,這幾個星期前。我已經複製粘貼下面my answer相關部分:

你要對傳入的請求查詢擴展CI的路由器和 數據庫 爲公司名稱的列表。如果 URI段與公司名稱 相匹配,則您需要使用公司/配置文件方法 提供它。如果它不是 ,您將忽略它並讓CI 正常處理它。看看這個主題 發表更多 信息:forum link

在這種情況下,只需換掉「用戶名」和「資料/頁面」的「公司」和「公司/資料」,使其與您的問題相關。