如何将ezComponents与magento集成

vol*_*lka 5 integration magento autoloader zeta-components

在'本机'Zend Framework应用程序中,我将通过将自动加载器ezComponents添加到Zends自动加载器来启用ezComponents:

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

现在,我想知道如何用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);

    }
Run Code Online (Sandbox Code Playgroud)

我认为这是一个非常糟糕的黑客,因为它会在升级Magento时被覆盖.有没有人有更好的主意?

Ala*_*orm 17

我在这里的基本方法是创建一个带有观察者的自定义模块

controller_front_init_before
Run Code Online (Sandbox Code Playgroud)

事件.在观察者事件中,您可以根据需要设置自动加载器.有一篇关于设置事件观察者的Magento Wiki文章.该controller_front_init_before事件是Magento最先发起的非通用事件之一.这就是我们使用它的原因.

我们需要解决的一个大问题是:Magento的自动加载器首先在堆栈中,如果找不到文件(EZComponent类就是这种情况),它的include会引发一个错误,停止执行.

所以,我们在上面的事件观察者中需要做的是

  1. Varien_Autoloader从中取出spl_autoload stack

  2. 注册我们自己的自动加载器(我们将使用Zend_Autoloader,因为它与Magento一起提供,你似乎熟悉它)

  3. 重新添加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);      
Run Code Online (Sandbox Code Playgroud)

将上面的代码放在观察者方法中,你应该好好去.

另一种可以采用Magento模式的方法是创建一个实现EZComponent加载器的自定义模块.

$o = Mypackage_Mymodule_Loader::getModel('ezcBaseFile');
Run Code Online (Sandbox Code Playgroud)

然后,您将在静态getModel方法中实现自动加载器样式需求代码,并在需要ezcBaseFile类时使用它.您可能想要在不实例化对象的情况下加载类的方法,以防您想要在ezcBaseFile基类上调用静态方法.

$o = Mypackage_Mymodule_Loader::getLoadclass('ezcBaseFile');
Run Code Online (Sandbox Code Playgroud)

  • 从PHP 5.3开始,您无需先使用hokey pokey来获取自动加载器.第三个参数是一个标记,用于添加自动加载器而不是附加. (6认同)

Jos*_*tey 0

我快速浏览了 Varien 自动加载器的代码,它似乎使用了对spl_autoload_register 的调用,这是一个用于执行自动加载的堆栈。虽然我认为添加到默认的 Magento 自动加载器不会取得多大成功,但这意味着您应该能够在 Magento 的顶部推送另一个自动加载器。

希望有帮助!

谢谢,乔