用于DB驱动动态控制器选择的Codeigniter pre_system挂钩 - 最佳方法?

时间:2010-05-21 21:47:03

标签: codeigniter hook callstack

虽然我暂时可以找到解决方法,但我想知道是否有一种明显更为简单的方法。

我的目标是使用给定URI的第一段来查询DB应该运行哪个控制器。

我假设我必须使用段1中的结果控制器名称来重构URI,然后允许系统继续正常处理(因此是pre_system挂钩)。

虽然不是必需的,但我还想在同一个DB请求中保存一些其他变量,以便稍后在调用堆栈中使用,并假设这必须使用全局变量来完成?

很高兴收到任何更好的建议。

感谢。

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:0)

我不会使用全局变量,如果可能,我更喜欢将其存储在库中以便稍后检索。在CI的背景下,全局变量有点混乱。

虽然在pre_system 此时只加载了基准测试和钩子类。这意味着除非你能找到一种选择的方法,否则你很可能会遇到全局变量pre_controller上的控制器,因为所有基类都已加载,您可以将数据放在更合乎逻辑的位置。