ここでの私の基本的なアプローチは、オブザーバーを使用してカスタム モジュールを作成することです。
controller_front_init_before
イベント。イベント オブザーバーでは、必要に応じてオートローダーをセットアップできます。Setting up Event Observersに関する Magento Wiki 記事があります。このcontroller_front_init_before
イベントは、Magento で発生する最初の非汎用イベントの 1 つです。それが私たちがそれを使用している理由です。
解決しなければならない大きな問題は、Magento のオートローダーが最初にスタックにあり、ファイルが見つからない場合 (EZComponent クラスの場合)、そのインクルードでエラーが発生して実行が停止することです。
したがって、上記のイベント オブザーバーで行う必要があるのは、
Varien_Autoloader
から を取り外しますspl_autoload stack
独自のオートローダーを登録します ( Zend_Autoloader
Magento に同梱されており、使い慣れているため、使用します)
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');