2011-04-13 82 views
2

當前在我的CI項目中,我有一個處理所有事物帳戶的單個控制器。例如,作爲註冊,登錄,激活等在CodeIgniter中從URL中刪除控制器名稱

我的工作路線這樣...

domain.com/account/login/domain.com/account/register/

如何從路線中刪除account同時還即將卸下控制器來自其他頁面。

我基本上想要控制器總是被刪除。我的原因之一是搜索引擎優化,搜索引擎根據網站的深度來評價頁面的不羈。

我似乎做到這一點的唯一方法就是爲每個頁面做一些像route['activate'] = 'account/activate';的事情,這將是一個巨大的麻煩。

+0

您是否預見過任何具有相同方法名稱的方法? – jondavidjohn 2011-04-13 01:42:09

+0

不是我能想到的 – Paramount 2011-04-13 01:53:31

回答

1

您的問題的答案是,你必須明確設置路線。

它是如何知道給定函數在哪個控制器中?

你得告訴它。

+0

多數民衆贊成在我的想法,但我希望有一些神奇的:) – Paramount 2011-04-13 01:48:19

+2

如果你想要魔法,使用rails,codeigniter期待你成爲魔術師。 – jondavidjohn 2011-04-13 01:49:52

1

使用mod_rewrite(如果控制器始終是相同的名稱)

2

試試這個:

$route['(:any)'] = "account/$1"; 
+0

這個問題是,我有多個控制器。 – Paramount 2011-04-13 02:14:47

+0

自從您提到「我有一個控制器可以處理所有事務帳戶」後,我就回答了這個問題。如果您有不同的控制器,則必須爲每個控制器明確設置路由。 – bhu1st 2011-04-13 02:20:42

+1

啊,我看到對不起,但我後來也提到我想把它給所有的控制器。 – Paramount 2011-04-13 03:16:35

1

好吧,我能想到的要做到這一點的一種方式,但它可能會是更多的這不僅僅是爲每個功能寫出路線。

您需要將Router.php擴展爲application/core/MY_Router.php並覆蓋_validate_request()方法。這基本上決定了這是否是有效的路線。

它檢查控制器類是否存在,如果不存在則失敗。 您需要用一些假定沒有控制器段的代碼替換它,然後掃描每個控制器並檢查它是否包含調用的方法(它將是段1,因爲沒有控制器)。

現在,棘手的部分,在CI生命週期的這一點,你的控制器顯然沒有加載,所以你不能使用method_exists()來檢查它。

你需要加載你的控制器一次一個,然後爲每一個運行

method_exists($loaded_class, $method_name) 

,如果它的真實,然後設置,然後繼續前進,並呼籲:

$this->set_class('the_name_of_the_scanned_class_which_had_the_method'); 

然後CI可以繼續正常進行,它會加載你的方法,而用戶不知道它從哪個控制器加載。

..可能不值得麻煩恕我直言。一個更簡單的解決方案是隻有一個控制器和一個路由到該控制器。

4
$route['^(?!other|controllers).*'] = 「account/$0″; 
+0

這對我有用。由於我的安裝過程中URL的重寫方式,我需要使用'$ route ['^(?!/ other |/controllers)。''='controller/$ 0';' – 2012-10-30 09:21:18

相關問題