1

uriが次のように見えるシステムを設計しています

my-app.com/client-name/admin/foo
my-app.com/client-name/admin/bar

client-name は可変です。明らかに、正気を維持するために、管理コントローラーをサブフォルダーに配置したいと考えています。したがって、私のフォルダーは次のようになります...

/application/controllers/admin/foo.php
/application/controllers/admin/bar.php

問題:

ドキュメントから: 「サブフォルダーへのコントローラーの整理 この機能を使用する場合、URI の最初のセグメントでフォルダーを指定する必要があります。」

とにかくこれを回避する方法はありますか?

管理コントローラを作成できますか

/application/controllers/admin.php

_remap 関数を使用して、サブフォルダーからコントローラーを手動でロードしますか?

アップデート:

私のルートは次のようになります

// Admin Root
$route['(:any)/admin'] = "admin/welcome";

次に、コントローラーがロードされる前に、最初の URI セグメントを検証して、クライアントが存在することを確認します。

すべてのクライアントが同じコントローラーとルートを使用します。

4

2 に答える 2

4

ルーティング方法の拡張を試みることができます。お気に入り:

<?php

/*
 * Custom router function v 0.1
 *
 * Add functionality : read into more than one sub-folder
 *
 */

Class MY_Router extends CI_Router
{
    Function MY_Router()
    {
        parent::CI_Router();
    }

    function _validate_request($segments)
    {
        if (file_exists(APPPATH.'controllers/'.$segments[0].EXT))
        {
            return $segments;
        }

        if (is_dir(APPPATH.'controllers/'.$segments[0]))
        {
            $this->set_directory($segments[0]);
            $segments = array_slice($segments, 1);

            /* ----------- ADDED CODE ------------ */

            while(count($segments) > 0 && is_dir(APPPATH.'controllers/'.$this->directory.$segments[0]))
            {
                // Set the directory and remove it from the segment array
            $this->set_directory($this->directory . $segments[0]);
            $segments = array_slice($segments, 1);
            }

            /* ----------- END ------------ */

            if (count($segments) > 0)
            {
                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].EXT))
                {
                    show_404($this->fetch_directory().$segments[0]);
                }
            }
            else
            {
                $this->set_class($this->default_controller);
                $this->set_method('index');

                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.EXT))
                {
                    $this->directory = '';
                    return array();
                }

            }

            return $segments;
        }

        show_404($segments[0]);
    }
}

?>

この方法はすべての人に有効であるとは限らず、長期的にはその価値よりも多くの問題を引き起こす可能性がありますが、何らかの理由でコントローラーを分離したい場合は可能です。ただし、動作させるにはかなりの調整が必要です。注: 新規インストールでこれを行いたいと思う可能性が高く、これが物事をどのように処理したいかを確実に知っています。

上記のコードの功績は認めません。元のリファレンスはここにあります。 http://glennpratama.wordpress.com/2009/10/20/multi-level-subfolder-for-controller-in-codeigniter/

于 2012-06-22T09:57:31.933 に答える
0

ルートを手動で設定した場合、これはうまく機能することがわかります。

素晴らしい!

于 2012-06-22T11:02:56.200 に答える