2010-05-21 56 views
0

雖然我可以暫時看到這個解決方案,但我想知道是否可能有一個明顯更簡單的方法。用於數據庫驅動的動態控制器選擇的Codeigniter預製系統鉤子 - 最佳方法?

我的目標是使用給定URI的第一個段來查詢DB應該運行哪個控制器。

我假設我將不得不重新構造URI,並使用段1中的結果控制器名稱,然後允許系統繼續正常處理(因此爲系統前鉤子)。

雖然不是必需的,但我還想在同一個數據庫請求中保留一些其他變量,以便稍後在調用堆棧中使用,並假定這將需要使用全局變量來完成?

任何更好的建議將很樂意收到。

謝謝。

回答

4

它應該對其他人有用,下面是實現所需結果的代碼。但是,這並沒有考慮傳遞額外的變量,因爲我可以沒有它們。

function set_controller() 
{ 
    include_once APPPATH.'config/database.php'; //Gather the DB connection settings 
    $link = mysql_connect($db[$active_group]['hostname'], $db[$active_group]['username'], $db[$active_group]['password']) or die('Could not connect to server.'); //Connect to the DB server 
    mysql_select_db($db[$active_group]['database'], $link) or die('Could not select database.'); //Select the DB 
    $URI = explode('/',key($_GET)); //Break apart the URL variable 
    $query = 'SELECT * FROM theDomainTable WHERE domainName = "'.$URI[1].'"'; //Query the DB with the URI segment 
    if($results = mysql_fetch_array(mysql_query($query))){ //Only deal with controller requests that exist in the database 
     $URI[1] = $results['controllerName']; //Replace the controller segment 
     $_GET = array(implode('/',$URI)=>NULL); //Reconstruct and replace the GET variable 
    } 
    mysql_close($link); //Close the DB link 
} 
+0

$ URI [1] = mysql_real_escape_string($ URI [1]); – 2012-03-31 22:37:53

0

我不會使用全局變量,如果可能的話,我更喜歡將它存儲在庫中供以後檢索。在CI的背景下,全局變量有點混亂。

雖然在pre_system只有基準測試和鉤子類已經加載在這一點上。這意味着你非常堅持使用全局變量,除非你可以找到一種方法來選擇pre_controller上的控制器,因爲所有的基類都被加載了,你可以把數據放在更合理的地方。

+0

Hey Aren,pre_controller是我第一次想到你提到的原因。我不會花時間鑽研核心文件來找到控制器選擇的地方,但我想現在可以(在週末之後!)。如果可能的話,這將是一個更加優雅的解決方案。 – Andy 2010-05-22 06:44:48

+0

我知道可以擴展任何基類。也許你可以擴展控制器的基類,並在對象上分配變量。 – Aren 2010-05-25 14:09:03

+0

我已經看了一場戲,如果我理解正確,這種方法將不起作用,因爲「pre_controller鉤子在超級對象完全構建之前執行。」 現在我們回到pre_system的原始建議。 – Andy 2010-05-26 12:23:31

相關問題