2

こんにちは私はそのようなものを作るつもりはありません。

http://example.com/ - メインコントローラー

http://example.com/rules/ - データベースからコンテンツを取得するメイン コントローラー。存在しない場合は 404 ページを返します。(大丈夫です、問題ありません。)

しかし、application/controlles/rules/ にサブフォルダーがある場合、Rules フォルダーの Main Contorller にリダイレクトしたいと考えています。

この次のコードは問題を解決できますが、どのように実現するのかわかりません。routes.php で:

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

$dirtest = $route['(:any)'];

if (is_dir(APPPATH.'controllers/'.$dirtest)) {
$route['(:any)'] = $dirtest.'/$1';
} else {
$route['(:any)'] = 'main/index/$1';
}

わかりました、私が持っているもの:

コントローラー/main.php

class Main extends CI_Controller {

    public function __construct()
        {
            parent::__construct();
            $this->load->model('main_model');
        }

    public function index($method = null)
    {
        if (is_dir(APPPATH.'controllers/'.$method)) {
            // Need re-rout to the application/controllers/$method/
        } else {
            if ($query = $this->main_model->get_content($method)) {
                $data['content'] = $query[0]->text;
                // it shows at views/main.php
            } else {
                show_404($method);
            }
        }
        $data['main_content'] = 'main';
        $this->load->view('includes/template', $data);
    }

}

再度更新(routes.php):だから、私が検索したもののようです(作業例):

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


$subfolders = glob(APPPATH.'controllers/*', GLOB_ONLYDIR);

foreach ($subfolders as $folder) {
    $folder = preg_replace('/application\/controllers\//', '', $folder);
    $route[$folder] = $folder.'/main/index/';
    $route[$folder.'/(:any)'] = $folder.'/main/$1';
}

$route['(:any)'] = 'main/index/$1';

しかし、次のようなものが完全に必要です。

http://example.com/1/2/3/4/5/6/...

  1. フォルダー「コントローラー」にサブフォルダー「1」がありますか?
  2. はい: フォルダー "1" にサブフォルダー "2" がありますか?
  3. いいえ: フォルダー「1」にはコントローラー「2.php」がありますか?
  4. いいえ: コントローラ "controllers/1/main.php" には関数 "2" がありますか?
  5. はい: http://example.com/1/2/ にリダイレクトします - ここで 3,4,5 - パラメータ..

次のような構造がある場合、それは本当に素晴らしいです:

http://example.com/blog/ - recent blog's posts
http://example.com/blog/2007/ - recent from 2007 year blog's posts
http://example.com/blog/2007/06/ - same with month number
http://example.com/blog/2007/06/29/ - same with day number
http://example.com/blog/web-design/ - recent blog's post's about web design
http://example.com/blog/web-design/2007/ - blog' posts about web design from 2007 years.
http://example.com/blog/current-post-title/ - current post

同じ興味深いhttp://codeigniter.com/forums/viewthread/97024/#490613を見つけました

4

3 に答える 3

3

私はあなたの質問を十分に読んでいませんでしたが、これはすぐに私の注意を引きました:

if (is_dir($path . '/' . $folder)) {
    echo "$route['$folder/(:any)'] = '$folder/index/$1';"; //<---- why echo ???
}

正直なところ、これが機能しないだけでなく、深刻な問題を引き起こさなかった理由がわかりません。

echoここでは、文字列を画面に出力しようとするだけなので、この方法では PHP として解釈されることさえありません。変数を文字列ではなく変数として読み取ることができるように、修正する必要がある引用符に関するいくつかの問題もあります。代わりにこれを試してください:

if (is_dir($path . '/' . $folder)) {
    $route[$folder.'/(:any)'] = $folder.'/index/$1';
}

余談ですが、あなたの問題とは直接関係ない追加のリソースを提供したいと思いますが、それでも解決策を提供するのに役立つはずです。

于 2011-08-07T23:36:30.477 に答える
1

ルートの登録が失敗する理由を言うのは難しいです。コードから、ルートを登録していないことがわかります (エコーするだけです)。さらに、文字列内の変数の使用法が一貫していないことがわかります。おそらくこれを少し混ぜたのでしょう。ルートに関するコードイグナイターのドキュメントも正確ではありません (いくつかのマイナーな点では、コード例は実際には構文的に正しくありませんが、全体的には良いです)。

最初にロジックを移動して、動的ルートを独自の関数に登録することをお勧めします。これにより、物事がもう少しモジュール化され、物事をより簡単に変更できるようになり、変数でグローバル名前空間を汚染しなくなります。

これに基づいて、コードを少しリファクタリングしました。これが機能するという意味ではありません (テストされていません) が、読むとより明確になる場合があります。

function register_dynamic_routes($path, array &$route)
{
    $nodes = scandir($path);
    if (false === $nodes)
    {
        throw new InvalidArgumentException(sprintf('Path parameter invalid. scandir("$path") failed.', $path));
    }

    foreach ($nodes as $node)
    {
        if ($node === '.' or $node === '..')
            continue
            ;

        if (!is_dir("{$path}/{$node}")
            continue
            ;

        $routeDef = "{$folder}/(:any)";
        $routeResolve = "{$folder}/index/\$1";
        $route[$routeDef] = $routeResolve;

        # FIXME debug output
        echo "\$route['{$routeDef}'] = '{$routeResolve}';";
    }
}

$path = APPPATH.'controllers/';
register_dynamic_routes($path, $route);
$route['(:any)'] = 'main/index/$1';

indexこれに続いて、おそらくすべてをアクションにシフトするのではなく、代わりにアクションにシフトしたいと思うかもしれませんdynamic。さらに、コントローラーごとにルートを追加するのではなく、すべてをサブコントローラーに委任するベースコントローラーが必要になる場合があります。しかし、それはあなた次第です。上記の例は、質問で概説したディレクトリ アプローチに基づいています。

編集:追加情報は、 URI ルーティング セクションの横にあるコントローラー セクションにあります。

于 2011-08-07T19:47:15.437 に答える