Как интегрировать ezComponents с magento
В "родном" приложении Zend Framework я бы разрешил использование ezComponents, добавив автозагрузчик ezComponents в автозагрузчик Zends:
$autoLoader = Zend_Loader_Autoloader::getInstance();
require_once('../library/EZComponents/Base/src/base.php');
$autoLoader->pushAutoloader(array('ezcBase', 'autoload'), 'ezc');
Теперь мне интересно, как я мог сделать то же самое с Magento. Есть ли способ расширить Varien_Autoload (автозагрузчик magentos) для простой интеграции ezComponents? ИЛИ: Есть ли способ использовать автозагрузчик Zends рядом с автозагрузчиком из Magento, не мешая друг другу?
редактировать:
Итак, я реализовал обходной путь, добавив следующее в функцию autoload() в Varien_Autoload:
if(substr($class, 0, 3) == 'ezc'){
require_once('EZComponents/Base/src/base.php');
return ezcBase::autoload($class);
}
Я считаю это очень плохим хаком, потому что он будет перезаписан при обновлении Magento. У кого-нибудь есть идея получше?
3 ответа
Мой основной подход здесь заключается в создании пользовательского модуля с наблюдателем для
controller_front_init_before
событие. В обозревателе событий вы сможете настроить свой автозагрузчик так, как хотите. Есть статья в Magento Wiki по настройке наблюдателей событий. controller_front_init_before
Событие является одним из первых неуниверсальных событий, которые запускаются в Magento. Вот почему мы используем это.
Большая проблема, которую мы должны решить, заключается в следующем: автозагрузчик Magento сначала находится в стеке, и если он не находит файл (что будет в случае классов EZComponent), его включение вызовет ошибку, которая остановит выполнение.
Итак, что нам нужно сделать в нашем наблюдателе событий выше, это
Удалить
Varien_Autoloader
отspl_autoload stack
Зарегистрируйте наш собственный автозагрузчик (мы будем использовать
Zend_Autoloader
, так как он поставляется с Magento, и вы, кажется, знакомы с ним)Повторно добавьте
Varien_Autoloader
в стек
Будут добавлены некоторые дополнительные jiggery-pokery, так как загрузка классов в 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 стиль автозагрузки и используете его всякий раз, когда вам нужен класс ezcBaseFile. Возможно, вам понадобятся методы для загрузки класса без создания экземпляра объекта, если вы хотите вызвать статический метод для ezcBaseFile
Базовый класс.
$o = Mypackage_Mymodule_Loader::getLoadclass('ezcBaseFile');
Я только что интегрировал класс Sailthru_Client в Magento, подумал, что это может помочь.
я имею sailthru.php
клиентский API Sailthru, который содержит Sailthru_Client
учебный класс.
я создал magentoroot/lib/Sailthru
затем скопируйте в нее файл sailthru.php, затем переименуйте в Client.php
делая это magentoroot/lib/Sailthru/Client.php
, Этот шаблон автоматически загружается Varien_Autoload
учебный класс.
Я быстро взглянул на код автозагрузчика Varien, и он, кажется, использует вызов http://us3.php.net/spl_autoload_register, который является стеком для выполнения автозагрузки. Хотя я не думаю, что у вас будет большой успех при добавлении к автозагрузчику Magento по умолчанию, это означает, что вы должны иметь возможность устанавливать другой автозагрузчик поверх Magento.
Надеюсь, это поможет!
Спасибо джо