CodeIgniter 2.x中的数据库驱动路由

Zab*_*abs 2 php codeigniter codeigniter-routing

我正在创建一个网站,其中有很多路由需要添加到路径文件(800+) - 显然我不想手动将这些路由逐个添加到路由配置文件中.

任何人都可以建议最佳做法让我的路由从数据库自动加载.是否有合适的库/帮助程序将执行适用于2.x版本的此任务

例如..

$route['apple'] = 'brands/index';
$route['blackberry'] = 'brands/index';
$route['htc'] = 'brands/index';
$route['samsung'] = 'brands/index';
Run Code Online (Sandbox Code Playgroud)

这些只是我要添加到路线中的几个品牌 - 但是有数百个,所以我想从数据库加载而不是手动输入这些.另外 - 这种方法会有什么影响从数据库加载它们的现场性能?

我正在使用Codeigniter v2.1.3

小智 10

如果你通过application/config/routes.php文件中的数据库调用不断查询数据库(在每个页面加载),那么我想会对性能产生很大的影响.

我建议(以及我之前完成此操作的方式)是在routes.php文件底部包含以下行,并将所有路由保存到缓存文件夹routes.php中的文件.

require_once APPPATH . 'cache/routes.php';
Run Code Online (Sandbox Code Playgroud)

然后,您可以将所有结果写入缓存文件(使用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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果要在管理区域中添加新路由,只需在每次提交新路由时运行上述功能,它将重新生成路由缓存文件.

此方法可使您的路由application/config/routes.php保持不变,但允许您将新路由写入缓存文件,而不会显着影响站点的性能.

希望有所帮助!!

  • @ MY_Mark,"会对性能产生很大影响".你能把这个陈述翻译成数字吗?在这种情况下你认为"大影响"是什么?0.00001一秒? (2认同)

小智 5

这是一个老问题,但我最近面临着同样的困境,并发现这个答案很有用。

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;
Run Code Online (Sandbox Code Playgroud)

内部 application/config/routes.php

//前两个是路由内的原始内容

$route[ 'default_controller' ]  = 'main';
$route[ '404_override' ]        = 'error404';
Run Code Online (Sandbox Code Playgroud)

//新版本

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';
}
Run Code Online (Sandbox Code Playgroud)

例如,我使用 INSERT INTO app_routes( slug, controller) VALUES ('about', 'pages/about');

或者你可以写一个小的cms来控制你的路线,这就是我根据网站上的最后几位所做的

id | slug  | controller  | actions
1  | about | pages/about | edit / delete
Run Code Online (Sandbox Code Playgroud)