2011-07-08 60 views
1

我最近一直在使用Codeigniter,並且我開始知道您可以重新映射控制器內的一個函數,以便您可以擁有動態的漂亮URL。
我只想知道可以用控制器完成同樣的工作嗎?我的意思是,如果我撥打http://example.com/stack,它會尋找一個名爲stack的控制器,如果找不到,它會調用一個固定/重新映射的控制器,以便我處理它。
可以這樣做嗎?重映射Codeigniter控制器

回答

1

是的,可以這樣做,您可以使用uri routing來實現。

在您的application/config/routes.php中,您可以將自定義路由設置爲重映射URI。
已經提供了2個,默認的(如果沒有控制器被調用)和404錯誤路由。

現在,如果您想要添加自定義路由,只需將它們添加到這兩個默認值之下,請記住,它們按照它們呈現的順序執行。

說,例如,你要重新映射「堆」到另一個控制器,只需使用:

$routes['stack'] = 'othercontroller'; 

這樣,當你訪問「堆棧」會自動映射到「othercontroller」,如果這不存在..好吧,你會得到相同的404錯誤。 如果您使用.htaccess從URL中隱藏index.php,請記住將其插入$config['index_page'] = 'index.php';

如果您試圖實現的目標是找不到控制器時的自定義錯誤消息,請按照@Juris Malinens所建議的覆蓋404路由,使用您的自定義默認控制器來處理該情況

$route['404_override'] = 'customcontroller'; 
+0

所以如果我使用404_override,customcontroller都會被調用控制器沒有找到時間,對不對? –

+1

@Bibhas你是對的,先生。它的行爲與常規默認消息相同,只是按照您的意願定製;它非常方便。 –

1

可以使用的.htaccess做到這一點還是配置/ routes.php-笨非常靈活;-)

如果沒有找到控制使用$路線[「404_override」];在config/routes.php中

0

application/config/routes.php文件將是適當的地方做到這一點。 Juris提到的404_override僅適用於CI 2.x,以防萬一您有舊版本(我不知道,您可能正在使用遺留系統,或可能在未來)。

請注意,您可以做的不僅僅是「重新映射」控制器。路線接受正則表達式模式,如htaccess重寫規則;也有一些CI模式,它們基本上只是正則表達式中更人爲可讀的別名。假設你有一個Articles控制器categorysearcharticle功能,你可能有一個看起來像路線:

$route["category/(:any)"] = "articles/category/$1"; 
$route["search/(:any)"] = "articles/search/$1"; 
$route["(:any)"] = "articles/article/$1'; 

你看你如何使用路線從您的網址完全刪除控制器的名字嗎?如果URL沒有明確說明它是分類頁面或搜索查詢,這些規則將回退到假定頁面是文章。然後,您可以檢查是否有針對該網址的文章,並根據需要顯示404。

3

也許這可以幫助你:

function _remap($method) 
    { 
     /// $method contains the second segment of your URI 
     switch($method)   
     { 
      case 'about-me': 
       $this->about_me(); 
       break; 

      case 'successful': 
       $this->display_successful_message(); 
       break; 

      default: 
       $this->page_not_found(); 
       break; 
     } 
    }