Преобразователь Codeigniter pre_system для динамического выбора контроллера на основе БД - лучший подход? - PullRequest
0 голосов
/ 22 мая 2010

Несмотря на то, что я неуверенно вижу решение этой проблемы, мне было интересно, может ли существовать явно очевидный более простой подход.

Моя цель - использовать первый сегмент данного URI для запроса к БД, какой контроллер следует запустить.

Я предполагаю, что мне придется преобразовать URI с результирующим именем контроллера в сегменте 1, а затем разрешить системе продолжить обработку в обычном режиме (отсюда перехват pre_system).

Хотя это и не существенно, я также хотел бы сохранить пару других переменных из того же запроса БД, которые будут использоваться позже в стеке вызовов, и предположить, что это должно быть сделано с использованием глобальных переменных?

Любые лучшие предложения будут с удовольствием приняты.

Спасибо.

Ответы [ 2 ]

4 голосов
/ 28 мая 2010

Если это кому-то пригодится, вот код для достижения желаемого результата.Это, однако, не учитывает передачу дополнительных переменных, потому что я могу жить без них.

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 голосов
/ 22 мая 2010

Я бы не использовал глобальные переменные, я бы предпочел сохранить их в библиотеке для последующего поиска, если это возможно. Глобальные переменные немного беспорядочные в контексте CI.

Хотя на pre_system На данный момент загружен только класс тестов и хуков. Это означает, что вы в значительной степени застряли с глобальными переменными, если не можете найти способ выбрать контроллер на pre_controller поскольку все базовые классы загружены, и вы можете поместить данные куда-нибудь более логично.

...