2012-04-16 70 views
3

我正在構建基於CodeIgniter的CMS。它將「視圖」及其數據存儲在數據庫中,並在需要時收集適當的數據。 正如您可能已經猜到的那樣 - 我無法爲每個頁面生成物理控制器和匹配視圖。CodeIgniter - 隱藏控制器

我認爲路由會非常方便,因爲我不想使用在URL中可見的控制器。不好解釋:我正在尋找一種方法來重新分配所有的請求,這些請求不會在物理上存在的控制器上自動生成,而不會出現在URL中。這個控制器當然會處理404錯誤等。

壞:.com/handler/actual-view/)好:(.com/actual-view/)(無實際視圖控制器存在,或者它會被顯示。)

我添加了一個404_override路徑指向handler/。現在,我只是在尋找一種方法來查找請求的視圖(即在.com/actual-view實際視圖是我正在尋找)。

我已經試過

$route['404_override/(:any)'] = 'handler/$1'; 

相似,這將徹底刪除404覆蓋。

回答

0

我的解決方案,在CodeIgniters真棒論壇和StackOverflow的可愛成員的一些指導後,成爲將所有404錯誤路由到我的自定義控制器,我確保它是一個真正的404(無視圖OR控制器)。後來在控制器中,我從我的數據庫URI字符串中收集剩餘的信息:

//Route 
$route['404_override'] = 'start/handler'; 

//Controller 
function handler($path = false) { 

    //Gather the URI from the URL-helper 
    $uri_string = uri_string(); 

    //Ensure we only get the desired view and not its arguments 
    if(stripos($uri_string, "/") !== false) { 
     //Split and gather the first piece 
     $pieces = explode("/", $uri_string); 
     $desired_view = $pieces[0]; 
    } else { 
     $desired_view = $uri_string; 
    } 

    //Check if there's any view under this alias 
    if($this->site->is_custom_view($desired_view)) { 

     //There is: ensure that the view has something to show 
     if(!$this->site->view_has_data($desired_view)) { 
     //No data to show, throw an error message 
     show_custom_error('no_view_data'); 
     } else { 
     //Found the views data: show it 
     } 

    } else { 
     //No view to show, lets go with 404 
     show_custom_404(); 
    } 
} 
0

你會過得更好的extending the base Router or Controller.

這樣,你讓你的應用程序要靈活,並且仍然符合CI是如何工作的。

+0

嗯..你願意詳細說明嗎? – Zar 2012-04-16 18:18:09

+0

這就是文檔的鏈接。你有具體的問題嗎? – Repox 2012-04-16 18:19:15

+0

我其實不瞭解一般的概念。如何延伸幫助我?我不知道如果我以某種方式無法改變正在定義的加載順序(控制器 - > 404到控制器 - >自定義 - > 404)......可能是在錯誤的圈子中思考; - )。 – Zar 2012-04-16 18:23:53

0

您需要定義所有的有效路由在你的route.php配置文件,然後在最後一行,

$routes["(:any)"] = "specific controller path"; 

,如果我要舉一個例子:

$route['u/(:any)/account'] = "user_profile/account/$1"; 
$route['u/(:any)/settings'] = "user_profile/settings/$1"; 
$route['u/(:any)/messages'] = "user_profile/messages/$1"; 
$route['u/(:any)'] = "user_profile/index/$1"; 

爲在這裏看到,我將所有的網址轉移到用戶檔案中,在前三個網站無法捕捉之後。

+0

這將如何修復實際結束於現有控制器上的請求?您的建議將強制所有請求由特定控制器處理。 – Repox 2012-04-16 18:56:41

+0

不,它會將路徑發送到特定的控制器,如果以前的路線無法捕捉的話。我在我的應用程序中自己使用它。 – 2012-04-16 19:01:12

+0

這就是我在找的東西,但是說實話,我寧願只是使用404_override或類似的東西(請參閱更新的OP)..感謝您的回覆:)! – Zar 2012-04-16 19:58:22