Как стать автором
Поиск
Написать публикацию
Обновить

CodeIgniter — роутинг через базу данных

Возникла необходимость сделать так, чтобы можно было выбирать какой URL на какой контроллер ведет. Каждый раз лазить в файлы и править правила роутинга не есть правильное решение. Кроме того, в основном на сайте будут расположены страницы, и хотелось бы чтобы был ЧПУ из названия раздела и страницы. Особо гуглить я на эту тему не стал и придумал своё решение.

Принцип действия следующий:
1. В базе содержатся alias'ы страниц, к примеру '/it' и '/it/articles'. Последнему соответствует определенный контроллер и метод, допустим 'pages' и 'showList' соответственно.
2. Роутинг CodeIgniter'a смотрит куда обращаться по query_string или path_info. Эту строку мы и будем сравнивать с alias'ом в базе.
3. После сравнения, мы находим самое большое вхождение имеющейся строки. Допустим, если мы введем в строке '/it/test', то результатом будет алиас '/it', а если '/it/articles/param1' — '/it/articles' (все это делается одним запросом)
4. Для передачи параметров, мы из исходной строки удаляем alias, тем самым получается остаток от URI и являющийся параметрами, которые передадутся методу.

Скрипт подключается в виде хука, перед загрузкой всей системы, до того момента, когда срабатывает класс роутинга.

  1. <?
  2.  
  3. /**
  4. * Класс роутинга через БД
  5. *
  6. */
  7. class APath
  8. {
  9.   function catcher()
  10.   {
  11.     // Подключаем класс для работы с БД
  12.     include_once('system/database/DB.php');
  13.     $this->db = &DB();
  14.     
  15.     // Делаем запрос в базу
  16.     $query = $this->db->query("SELECT CONCAT('/',controller,'/',IFNULL(method,'index'),'/') as cm, alias FROM pages WHERE '".mysql_escape_string($_SERVER['PATH_INFO'])."' LIKE concat(alias,'%') ORDER BY LENGTH(alias) DESC LIMIT 1");
  17.     
  18.     // Проверяем есть ли результат
  19.     if($query->num_rows() > 0)
  20.     {      
  21.       // Распиливаем строку на сегменты, и вырезаем alias
  22.       $segments = str_replace($query->row()->alias,'',$_SERVER['PATH_INFO']);
  23.       
  24.       // Добавляем сегменты - как параметры метода
  25.       $_SERVER['PATH_INFO'] = $query->row()->cm.'/'.$segments;
  26.     }
  27.     else
  28.     {
  29.       show_404();
  30.     }
  31.   }
  32. }
  33.  
  34. ?>
* This source code was highlighted with Source Code Highlighter.

База в которую делается запрос, выглядит следующий образом:

--
-- Структура таблицы `pages`
--

CREATE TABLE IF NOT EXISTS `pages` (
 `id` int(9) NOT NULL auto_increment,
 `alias` varchar(250) NOT NULL,
 `title` varchar(250) NOT NULL,
 `controller` varchar(100) NOT NULL,
 `method` varchar(100) NOT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `alias` (`alias`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


* This source code was highlighted with Source Code Highlighter.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.