具有非常规 class 名称的 Magento - 在 Magento 中生成 WSDL class 名称

Magento with non-convention class names - generated WSDL class names within Magento

我们正在使用 WSDL2PHPGenerator 为商店需要在各种事件中调用的 Web 服务生成 类。 因为它们是按名称 1 对 1 生成和序列化的,所以无法更改 类 名称。 出于这个原因,它们没有按照 Company_Module_ClassName 的约定命名 - 所以即使我们设法需要这些文件,当尝试创建一个新实例时,Magento 自动加载器函数在末尾有一个 include 语句它将为每个 类 触发异常,因为它无法使用名称约定找到它们。

解决这个问题的正确方法是什么?有人处理过这个流程吗?

如果分解成更小的问题可能有助于解决更大的问题。

1.Is 有办法禁用特定 类 的自动加载器吗? 我们尝试通过以下方式禁用/启用:

 $autoloadFuncs = spl_autoload_functions();
 foreach ($autoloadFuncs as $unregisterFunc) {
     spl_autoload_unregister($unregisterFunc);
 }

但是在重新启用它之后,Magento 加载器停止加载新的 类 ...

2.Is 有没有命名约定加载 类 的方法?

3.Is 有没有一种方法可以将 SoapClient 与 类 一起使用,其名称与应以最终 XML 格式序列化的 类 不同?

可能没有“正确”的方法来做到这一点,但当我遇到类似情况时,我

  1. 编写了一个能够正确加载特殊 classes 的自动加载器函数

  2. Varien_Autoload 自动加载器

    的前面插入了一个自动加载器函数

回复:数字 2,类似这样的东西应该可以工作(伪代码)

 //get all current autoload functions
 $autoloadFuncs = spl_autoload_functions();

 //unregister all autoload functions (autoload queue will be empty)
 foreach ($autoloadFuncs as $unregisterFunc) {
     spl_autoload_unregister($unregisterFunc);
 }    

 //add your autoloading code here -- doesn't need to be an
 //anonymous function, any valid PHP callback will do
 spl_autoload_register(function(){
      //your autoloader code
 });

 //add the old autoloader functions back
 foreach ($autoloadFuncs as $unregisterFunc) {
     spl_autoload_register($unregisterFunc);
 }    

这将确保您的函数的自动加载器优先,这样 Magento 的异常抛出自动加载器就永远不会触发。只要确保 你的 自动加载器在找不到 class.

时自动失败

此外,如果您使用的是 PHP 的更先进的现代版本,spl_auto_reguster 函数的第三个参数将允许您在 before[=37] 中添加新的自动加载器函数=] 所有其他的(放在前面)。这将使您避免上面的 unregister/register 代码

spl_autoload_register(function(){
    //your autoload code here
},true,true);

根据评论进行更新 -- 一个小示例程序显示自动加载器将在找到匹配项后停止调用堆栈上的回调。

<?php
    function one()
    {
        class Foo{
        }
        echo __FUNCTION__,"\n";
    }

    function two()
    {
        echo __FUNCTION__,"\n";
    }    

    function main()
    {
        spl_autoload_register('one');
        spl_autoload_register('two');
    
        $foo = new Foo;
    }
    main();