Я создаю сайт, на котором будет много маршрутов, которые нужно будет добавить в файл маршрутов (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