5

「ネイティブ」Zend Framework アプリケーションでは、ezComponents のオートローダーを Zend オートローダーに追加することで、ezComponents の使用を有効にします。

$autoLoader = Zend_Loader_Autoloader::getInstance();
require_once('../library/EZComponents/Base/src/base.php');
$autoLoader->pushAutoloader(array('ezcBase', 'autoload'), 'ezc'); 

今、Magento で同じことを行うにはどうすればよいか考えています。Varien_Autoload (magentos オートローダー) を拡張して ezComponents を簡単に統合できるようにする方法はありますか? または: 互いに干渉することなく、Magento のオートローダーの横に Zends オートローダーを使用する方法はありますか?

編集:

さて、Varien_Autoload の関数 autoload() に以下を追加することで、回避策を実装しました。

if(substr($class, 0, 3) == 'ezc'){
        require_once('EZComponents/Base/src/base.php');
        return ezcBase::autoload($class);

    }

ただし、Magento をアップグレードすると上書きされるため、これは非常に悪いハックだと思います。誰かがより良いアイデアを持っていますか?

4

3 に答える 3

17

ここでの私の基本的なアプローチは、オブザーバーを使用してカスタム モジュールを作成することです。

controller_front_init_before

イベント。イベント オブザーバーでは、必要に応じてオートローダーをセットアップできます。Setting up Event Observersに関する Magento Wiki 記事があります。このcontroller_front_init_beforeイベントは、Magento で発生する最初の非汎用イベントの 1 つです。それが私たちがそれを使用している理由です。

解決しなければならない大きな問題は、Magento のオートローダーが最初にスタックにあり、ファイルが見つからない場合 (EZComponent クラスの場合)、そのインクルードでエラーが発生して実行が停止することです。

したがって、上記のイベント オブザーバーで行う必要があるのは、

  1. Varien_Autoloaderから を取り外しますspl_autoload stack

  2. 独自のオートローダーを登録します ( Zend_AutoloaderMagento に同梱されており、使い慣れているため、使用します)

  3. Varien_Autoloaderをスタックに再度追加する

Zend名前空間内のクラスのロードは、通常、削除するオートローダーによって処理されるため、少し余分な処理が必要になります。詳細については、コメントを参照してください

//we need to manually include Zend_Loader, or else our zend autoloader
//will try to use it, won't find it, and then try to use Zend_Loader to
//load Zend_Loader
require_once('lib/Zend/Loader.php');


//instantiate a zend autoloader first, since we 
//won't be able to do it in an unautoloader universe
$autoLoader = Zend_Loader_Autoloader::getInstance();        

//get a list of call the registered autoloader callbacks
//and pull out the Varien_Autoload.  It's unlikely there
//are others, but famous last words and all that
$autoloader_callbacks = spl_autoload_functions();
$original_autoload=null;
foreach($autoloader_callbacks as $callback)
{
    if(is_array($callback) && $callback[0] instanceof Varien_Autoload)
    {
        $original_autoload = $callback;
    }
}

//remove the Varien_Autoloader from the stack
spl_autoload_unregister($original_autoload);

//register our autoloader, which gets on the stack first
require_once('library/EZComponents/Base/src/base.php');
$autoLoader->pushAutoloader(array('ezcBase', 'autoload'), 'ezc');           

//lets just make sure we can instantiate an EZ class
#$test = new ezcBaseFile();
#var_dump(get_class($test));

//IMPORANT: add the Varien_Autoloader back to the stack
spl_autoload_register($original_autoload);      

上記のコードをオブザーバー メソッドに入れてください。

Magento パターンにより適合する別のアプローチとして、EZComponent ローダーを実装したカスタム モジュールを作成する方法があります。

$o = Mypackage_Mymodule_Loader::getModel('ezcBaseFile');

次に、静的な getModel メソッドでオートローダー スタイルの require コードを実装し、ezcBaseFile クラスが必要なときにいつでもそれを使用します。基本クラスで静的メソッドを呼び出したい場合に備えて、オブジェクトをインスタンス化せずにクラスをロードするためのメソッドが必要になるでしょうezcBaseFile

$o = Mypackage_Mymodule_Loader::getLoadclass('ezcBaseFile');
于 2011-01-08T23:02:22.470 に答える
0

Varienのオートローダーのコードをざっと見てみると、オートロードを実行するためのスタックであるspl_autoload_registerの呼び出しを使用しているようです。デフォルトのMagentoオートローダーに追加してもあまり成功しないと思いますが、これは、Magentoの上に別のオートローダーをプッシュできるはずであることを意味します。

お役に立てば幸いです。

ありがとう、ジョー

于 2010-11-03T13:33:32.653 に答える
0

Sailthru_Client クラスを Magento に統合したところ、これが役立つかもしれないと考えました。

クラスをsailthru.php含む Sailthru Client API がありますSailthru_Client

フォルダーを作成magentoroot/lib/Sailthruし、sailthru.php をそのフォルダーにコピーし、名前を変更しClient.phpて、magentoroot/lib/Sailthru/Client.php. Varien_Autoloadこのパターンは、クラスによって自動ロードされます。

于 2010-11-04T13:59:31.747 に答える