2

ルート ファイル (800 以上) に追加する必要がある多くのルートを持つサイトを作成しています - 明らかに、ルート構成ファイルにこれらを 1 つずつ手動で追加したくありません。

私のルートをデータベースから自動的にロードするためのベストプラクティスを誰でも提案できますか? バージョン 2.x で動作するこのタスクを実行する適切なライブラリ/ヘルパーはありますか?

例えば..

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

これらはルートに追加するブランドのほんの一部ですが、数百あるので、これらを手動で入力するのではなく、データベースからロードしたいと思います。また、この方法は影響がありますかそれらをデータベースからロードするオンサイトパフォーマンス?

Codeigniter v2.1.3 を使用しています

4

4 に答える 4

10

ファイル内の DB 呼び出しを介して (ページの読み込みごとに) 常にデータベースにクエリを実行する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そのまま保持されますが、サイトのパフォーマンスに大きな影響を与えることなく、新しいルートをキャッシュ ファイルに書き込むことができます。

それが役立つことを願っています!!

于 2013-06-11T13:44:23.737 に答える
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;

application/config/routes.php 内

//上の 2 つはルート内のオリジナルです

$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
于 2014-01-22T04:54:32.987 に答える