具有非约定类名的Magento - 在Magento中生成WSDL类名

时间:2015-09-07 23:35:50

标签: php magento wsdl

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

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

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

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

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

但是在启用它之后,Magento加载程序停止加载新类......

2.有没有一种方法可以在没有命名约定的情况下加载类?

3.是否有一种方法可能使用SoapClient,其名称与应该以最终XML格式序列化的类不同?

谢谢你,詹姆斯。

1 个答案:

答案 0 :(得分:2)

可能没有"对"这样做的方法,但是当我遇到类似的情况时,我已经

  1. 编写自动加载器函数,正确加载特殊类

  2. Varien_Autoload自动加载器

  3. 前面插入自动装带器功能

    Re:数字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的异常抛出自动加载器永远不会触发。如果无法找到课程,请确保您的自动装载机无声地失败。

    此外,如果您使用的是即使是远程现代版本的PHP,spl_auto_reguster功能的第三个参数将允许您添加新的自动加载器功能之前所有其他人(在它之前)。这样可以避免上面的取消注册/注册代码

    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();