3

新しいCodeigniterアプリケーションを起動し、サードパーティのモジュールソース(Tank Authなど)を自分のコードから分離する方法を見つけようとしています。必要なのは、次のようなファイルツリーを設定することです。

  • / project_root /
    • / system (フレームワークシステム-完了)
    • / 3rd_party /
      • / dists /
      • / application / (インストールされたサードパーティライブラリ/モジュール-質問トピック
    • / application / (私のアプリケーション-完了)
    • / site / (サイトルート、作業ツリー-完了)

と設定/application /siteを使用して行われた/system 。index.phpapplication/config/config.php

構成設定を使用して上記のようなツリーを実現する正しい方法はありますか?私はCodeigniterを初めて使用しましたが、それが可能かどうかさえわかりません。

4

3 に答える 3

3

Codeigniter、Modular Extensionsを備えたモジュラー構造の場合、HMVCは頼りになるソリューションです。

https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc

あなたのセットアップのために、あなたはこれをあなたのconfig.php:に追加するでしょう

$config['modules_locations'] = array(
    // absolute path                    relative path
    APPPATH.'3rd_party/application/' => '../../3rd_party/application/',
);
  • / project_root /
    • /システム
    • / 3rd_party /
      • / dists /
      • /応用/
        • tank_auth
        • my_module
        • some_other_third_party_code
    • /応用/
    • /サイト/

「相対パス」は、、、などのアプリケーションルート内の任意のサブディレクトリからの相対パスです。modelsたとえば、CIでは、次を使用すると、「view」ディレクトリから「model」をロードできます。controllershelpers

$this->load->model('../views/some_model');

...それはあなたが通常行うことではありません-しかし、これはHMVCのローダーがどのように機能するかです。HVMCを使用して、CIが通常できるものはすべて、「モジュール」ディレクトリからロードできます。必要な数の異なるモジュールまたはモジュールパスを持つことができます。

モジュールは、コントローラーをロードして、独自のミニアプリケーションのように動作させることができます(ただし、そうする必要はありません)。モジュール間で、またはデフォルトのアプリケーションルートから依存関係をロードすることもできます。モジュールと一緒にデフォルトのアプリケーションディレクトリを引き続き使用できます。モジュールパスから特定のアセットをロードすることを指定するには、パスにモジュール名を含めるだけです。

// Loads the "tank_auth" library (works from the tank_auth module)
$this->load->library('tank_auth');

// Loads the "tank_auth" library (works from anywhere in your application)
$this->load->library('tank_auth/tank_auth');

これは、モデル、ヘルパーなどでも機能します。

のコントローラーにアクセスするにtank_auth/controllers/loginは、URLを使用しますhttp://example.com/tank_auth/login。このメソッドを使用して、別のコントローラー内でコントローラーを実行することもmodules::run()できます。これにより、モジュールのコントローラーメソッドを、モジュールに触れることなく独自のロジックで「ラップ」できます。

class my_login extends MX_Controller {
    function index() {
        modules::run('tank_auth/login');
    }
}

それはかなりよく文書化されており、何年も前から存在しています。私はこれまでに行ったほぼすべてのCodeigniterプロジェクトでHMVCを使用してきましたが、これを強くお勧めします。

于 2012-12-19T18:16:27.930 に答える
0

問題は、ライブラリをロードするローダークラス$this->load->library("path/to/module")が、ハードコードされた「ライブラリ」をフォルダー名として使用していることです(Loader.phpのソースを確認してください)。つまり、すべてのモジュールとライブラリはライブラリフォルダに存在する必要があります

  • / project_root /

    • / system(フレームワークシステム-完了)
    • /図書館/
      • / 3rd_party /
        • /応用/

そしてそれらを$this->load->library('3rd_party/application/tankh_auth.php)`でロードします

これを修正する(そしてライブラリフォルダを使用しない)唯一の方法は、独自のを記述してLoaderクラスをオーバーライドすることです。特に、ライブラリメソッドをオーバーライドして、applicationフォルダにLoader.phpを作成しますapplication/core

class My_Loader extends CI_Loader {


  function __construct() {
        parent::__construct();

}

public function library($library = '', $params = NULL, $object_name = NULL){

  //override this method with your custom loader code 

   //eg  


  include_once($filepath."/".$library); //where your $filepath is path to your library,  

  $this->_ci_loaded_files[] = $filepath;  
  return $this->_ci_init_class($class, '', $params, $object_name);

  //again look at original methods and/or  write your own by referencing those
}



}
于 2012-12-16T23:24:55.320 に答える
0

HMVCで心配する必要はありません(それは素晴らしいですが)、そしてあなたも必要ありませんMY_Loader

http://ellislab.com/codeigniter/user-guide/libraries/loader.html-つまり、アプリケーション「パッケージ」のセクションを読みます。

ここでは、というメソッドが表示されます

$this->load->add_package_path()

ローダーがライブラリを検索するための追加のパスを指定できます。

于 2012-12-17T15:17:37.637 に答える