38

プロジェクトに統合したライブラリを別のコントローラーの関数からコントローラーをロードしたいのですが、コントローラーをクリーンで関連性のある状態に保ちたいので、コントローラーにロードしたくないのです。

モジュールを使用してみましたが、コントローラーを次のようにURLに配置する必要がありました

http://example.com/maincontroller/function
http://example.com/othercontroller/function

私はデフォルトのコントローラーを持っているので、 http://example.com/functionをロードできるので、メインの関数からコントローラーにアクセスするにはどうすればよいので、コントローラーをURLに入れる必要はありません。

メインコントローラー関数からコントローラー関数をロードできるのであれば、HMVC を使用したいと考えています。

4

9 に答える 9

50

はい、できます (バージョン 2 の場合)

コントローラー内にこのようにロードします

 $this->load->library('../controllers/whathever');

次のメソッドを呼び出します。

$this->whathever->functioname();
于 2014-03-13T15:08:47.397 に答える
24

HMVC などを使用しない限り、CI のコントローラーからコントローラーをロードすることはできません。

アーキテクチャについて少し考える必要があります。別のコントローラーからコントローラー メソッドを呼び出す必要がある場合は、おそらくそのコードをヘルパーまたはライブラリに抽象化し、両方のコントローラーから呼び出す必要があります。

アップデート

あなたの質問をもう一度読んだ後、あなたの最終目標は必ずしも HMVC ではなく、URI 操作であることがわかりました。私が間違っている場合は修正してください。ただし、最初のセクションがメソッド名であり、コントローラー名を完全に省略して URL を達成しようとしているようです。

このような場合は、ルートを工夫することで、よりクリーンなソリューションを得ることができます。

非常に基本的な例として、2 つのコントローラーがあるcontroller1としcontroller2ます。 Controller1にはメソッドがあり、メソッドmethod_1controller2はメソッドがありmethod_2ます。

次のようにルートを設定できます。

$route['method_1'] = "controller1/method_1";
$route['method_2'] = "controller2/method_2";

http://site.com/method_1次に、メソッド 1 を URL で、メソッド 2 を で呼び出すことができますhttp://site.com/method_2

とはいえ、これはハードコーディングされた非常に基本的な例ですが、URL からコントローラーを削除するだけでよい場合は、必要な場所に到達できます。


コントローラーを再マッピングすることもできます。

ドキュメントから: 「コントローラーに _remap() という名前の関数が含まれている場合、URI に含まれるものに関係なく、常に呼び出されます。」:

public function _remap($method)
{
    if ($method == 'some_method')
    {
        $this->$method();
    }
    else
    {
        $this->default_method();
    }
}
于 2013-01-04T22:32:26.340 に答える