Маршрутизация, управляемая базами данных в CodeIgniter 2.x

Я создаю сайт, на котором будет много маршрутов, которые нужно будет добавить в файл маршрутов (800+) – очевидно, я не хочу вручную добавлять их по одному в файл конфигурации маршрутов.

Может ли кто-нибудь предложить лучшую практику, чтобы мои маршруты загружались автоматически из базы данных. Есть ли подходящая библиотека / помощник, которая будет выполнять эту задачу, которая работает с версией 2.x

Например..

$route['apple'] = 'brands/index'; $route['blackberry'] = 'brands/index'; $route['htc'] = 'brands/index'; $route['samsung'] = 'brands/index'; 

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

Я использую Codeigniter v2.1.3

Если бы вы постоянно запрашивали базу данных (на каждой загрузке страницы) через вызов БД в файле application/config/routes.php то я предполагаю, что это будет иметь большое влияние на производительность.

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

 require_once APPPATH . 'cache/routes.php'; 

Затем вы можете записать все свои результаты в файл кеша (используя вспомогательный файл файла CI) с функцией, подобной приведенной ниже:

 public function save_routes() { $routes = $this->routes_model->get_all_routes(); $data = array(); if (!empty($routes )) { $data[] = '<?php if ( ! defined(\'BASEPATH\')) exit(\'No direct script access allowed\');'; foreach ($routes as $route) { $data[] = '$route[\'' . $route['uri'] . '\'] = \'' . $route['controller'] . '/' . $route['action'] . '\';'; } $output = implode("\n", $data); write_file(APPPATH . 'cache/routes.php', $output); } } 

Если вы добавляете новые маршруты в область администратора, просто запускайте указанную выше функцию каждый раз, когда вы отправляете новый маршрут, и он будет генерировать файл кеша маршрутов.

Этот метод сохраняет ваши маршруты в application/config/routes.php неповрежденными, но позволяет вам писать новые маршруты в файл кеша, не оказывая существенного влияния на производительность сайта.

Надеюсь, это поможет!!

Это старый вопрос, но недавно я столкнулся с той же дилеммой и нашел этот ответ полезным.

http://osvaldas.info/smart-database-driven-routing-in-codeigniter

Создайте таблицу, в которой вы разместите все свои маршруты

 CREATE TABLE IF NOT EXISTS `app_routes` ( `id` bigint(20) NOT NULL auto_increment, `slug` varchar(192) collate utf8_unicode_ci NOT NULL, `controller` varchar(64) collate utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`), KEY `slug` (`slug`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1; 

Внутри приложения / config / routes.php

// верхние два являются оригиналами внутри маршрутов

 $route[ 'default_controller' ] = 'main'; $route[ '404_override' ] = 'error404'; 

// новые выпуски

 require_once( BASEPATH .'database/DB'. EXT ); $db =& DB(); $query = $db->get( 'app_routes' ); $result = $query->result(); foreach( $result as $row ) { $route[ $row->slug ] = $row->controller; $route[ $row->slug.'/:any' ] = $row->controller; $route[ $row->controller ] = 'error404'; $route[ $row->controller.'/:any' ] = 'error404'; } 

Например, я работал с INSERT INTO app_routes ( slug , controller ) VALUES ('about', 'pages / about');

или вы можете написать небольшой cms, чтобы управлять своими маршрутами, что я сделал по последним битам на веб-сайте

 id | slug | controller | actions 1 | about | pages/about | edit / delete 

У меня может быть решение для управления пользовательским uri в приложении CI.

Скажем, есть таблица с названием «маршруты»,

 CREATE TABLE IF NOT EXISTS `routes` ( `alias` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `uri` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, PRIMARY KEY (`alias`), UNIQUE(`alias`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; 

Затем пользовательский «помощник URL» (application / helper / MY_url_helper.php)

 // function that produces a safe uri if( ! function_exists('safe_uri')) { function safe_uri($str, $replace=array(), $delimiter='-') { if( !empty($replace) ) { $str = str_replace((array)$replace, ' ', $str); } $clean = iconv('UTF-8', 'ASCII//TRANSLIT', $str); $clean = preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $clean); $clean = strtolower(trim($clean, '-')); $clean = preg_replace("/[\/_|+ -]+/", $delimiter, $clean); return $clean; } } // overriden function that checks if the uri exists in the routing table. If so, use this uri instead if ( ! function_exists('site_url')) { function site_url($uri = '') { $CI =& get_instance(); if(in_array($uri, $CI->router->routes)){ $key = array_search($uri, $CI->router->routes); if($key)$uri=$key; } return $CI->config->site_url($uri); } } 

Затем библиотеку, которую я назвал «route_manager», которая создает / изменяет маршрут и генерирует пользовательский файл route.php (application / libraries / route_manager.php, создает приложение / cache / routes.php)

Примечание . Ваше приложение должно иметь возможность записывать файлы в «приложение / кеш»,

 <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class route_manager{ public function set_alias($full_text, $uri){ $this->load->helper('url'); $sql = 'INSERT INTO `routes` (`alias`, `uri`) VALUES(?,?) ON DUPLICATE KEY UPDATE uri=VALUES(uri)'; $this->db->query($sql, array(safe_uri($full_text), $uri)); } public function create_routes_file(){ $res = $this->db->get('routes'); $output = '<' . '?' . 'php ' . 'if ( ! defined(\'BASEPATH\')) exit(\'No direct script access allowed\');' . CRLF . CRLF; foreach($res->result_array() as $rs){ $output .= '$' . 'route[\'' . $rs['alias'] . '\'] = "' . $rs['uri'] . '";'. CRLF; } // unsure the file won't generate errors $route = array(); eval('?> '.$output); // if error detected, the script will stop here (and won't bug the entire CI app). Otherwize it will generate the cache/route.php file $this->load->helper('file'); write_file(APPPATH . 'cache/routes.php', $output); } } 

Затем добавьте require_once (4-я строка в примере ниже) в файл application / config / routes.php

 <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); // require custom routes (if the file exists) if(file_exists(APPPATH . 'cache/routes.php'))require_once(APPPATH . 'cache/routes.php'); $route['default_controller'] = "welcome"; $route['404_override'] = ''; 

Все будет работать, используя хороший uri!

Например, чтобы создать индивидуальный жуткий uri, скажем, супер-страницу, которая ROCKS! (действительно) 'должен быть перенаправлен на «page» контроллер, «индекс» с функцией «23» в качестве параметра:

 $this->load->library('route_manager'); $this->route_manager->set_alias('super page that ROCKS! (really)', 'page/index/23'); $this->route_manager->create_route_file(); 

Пример использования этого пользовательского uri

 echo site_url('page/index/23'); 

В этом примере создается дружественный и рабочий URL-адрес:

http://www.yourwebsite.com/index.php/super-page-that-rocks-really