2
  • 私はCodeigniter 2.1.0を使用しています。
  • 私はこれがうまく機能require_once APPPATH . "/libraries/aws_sdk/sdk.class.php";

を使用してカスタムモデルでAmazon WebサービスSDKを含めています。しかし、CIは、それが後には、DBキャッシュクラスのロードする必要が決定したとき、それは(cache_init :: _ CI_DB_driver経由)を呼び出します:PHP AWS SDKオートローダとCodeigniterとの競合

if (! class_exists('CI_DB_Cache')) 
{ 
    if (! @include(BASEPATH.'database/DB_cache.php')) 
    { 
     return $this->cache_off(); 
    } 
} 

これは、AWS SDK(正確な方法はCFLoader::autoloaderである)の自動ロードをトリガします。

私はclass_exists falseを返した場合、とにかくDB_cache.phpが含まれているようだとして、ない自動ロードにclass_existsを伝えることにより、これを回避することができます

if (! class_exists('CI_DB_Cache', false)) 
{ 
    if (! @include(BASEPATH.'database/DB_cache.php')) 
    { 
     return $this->cache_off(); 
    } 
} 

この汚い修正作品が、明らかにのみ当面の問題を修正。一般に、CodeIgniterが他のライブラリからの自動ロードと混同されないようにする最良の方法は何ですか?

ご注意:spl_autoload_registerの使用に関する

  • 私が読んだこまごまとします。 Codeigniterはこれを使用していないようですが、私はこれをどのようにして安全に実装すべきか分かりません。私はこの最も実用的な方法(そして、これが解決策である場合)をどのように、どこで実装すべきかの確かな例を見つけるでしょう。
  • それはAWS SDKはすでにspl_autoload_registerを使用していることを表示されます。spl_autoload_register(array('CFLoader', 'autoloader'));

答えて

4

ご存じでしょうが、あなたは本当にCIの中核方法を変更する必要はありません。だから、あなたのクラスと競合からCIを防ぐために、あなたは以下と非常に似た何かをしたい:

であるとして、あなたのフォルダ構造を残すが、新しいファイルを作成外のごaws_sdkフォルダ。 * Aws_loader *などの名前を付けてください。 sdkを自動ロードする場合は、CIオートローダーファイルに次のように追加します。

CI自動ロードファイル(application/config/autoload。PHP):

$autoload['libraries'] = array('Aws_loader'); 

あなたのinitファイルは:

class CI_Aws_sdk{ 
    // for use with PHP < version 5 
    /*public function CI_Aws_sdk(){ 
     require dirname(__FILE__) . DIRECTORY_SEPARATOR . "aws_sdk" .DIRECTORY_SEPARATOR . 'sdk.class.php'; 
    }*/ 

    // for use with PHP >= 5 
    public function __construct(){ 
     require dirname(__FILE__) . DIRECTORY_SEPARATOR . "aws_sdk" .DIRECTORY_SEPARATOR . 'sdk.class.php'; 
    } 
} 

だからあなたのディレクトリ構造は次のようになります。

application -- 
    config -- 
    ... 
    libraries -- 
    Aws_loader.php 
    aws_sdk -- 
     sdk.class.php 

SDKを自動ロードされていない場合は、お使いのコントローラにこれを行うことができます:

$this->load->library('Aws_loader'); 

どちらの方法でも、CIを読み込んでクラス内のメソッドを効果的に分離することができます。これで、CIのメソッドに干渉することなく、以前ロードした他のライブラリやモデルと同じようにクラス内で操作できます。

$this->Aws_loader->do_something(); 

サードパーティ製のクラスライブラリまたは自分で作成したクラスライブラリでも同じ方法を使用できます。モデル、ライブラリ、ヘルパーなどに非常によく似た配置を使用することができます。 これが役立つことを願っています!

関連する問題