使用php的SoapClient时,classmap选项无法正常工作

Dam*_*eem 5 php soap wsdl zend-framework soap-client

目前我正在开发内部肥皂服务来控制一些内部流程.这通常不是那么难.然而,我尝试使用soapClient类映射功能来映射对象,而不是使用通常为非complextypes返回的stdClasses.

考虑到wsdl和源代码占用大量空间的事实,我将链接到相关文档而不是在这个问题中发送垃圾邮件.

首先,我使用Zend_Soap_Server和Zend_Soap_Server_Autodiscover为我的Soap服务和wsdl生成.

肥皂服务器代码:https: //www.dropbox.com/s/eji7l50g42m2ixl/SoapServer.txt

针对?wsdl请求的WSDL结果:https: //www.dropbox.com/s/vyxbjz7wogd8suy/wsdl.txt

soap服务发布服务类.此类包含从soap服务获取数据的方法.此方法称为getPackages.

getPackages方法构成soap服务:https: //www.dropbox.com/s/p5ddxpraju7ru6x/method_from_serviceclass.txt

getPackages方法返回一个DataObject,而DataObject又返回包含对其他数据对象的引用.这些对象作为客户端存在于两个服务器上,两端完全相同.

主要数据对象:https: //www.dropbox.com/s/qt51pw3rpq7c2ba/dataobject.txt

当连接到此服务并调用getPackages方法时,我按预期获得响应:包含vps和共享属性的stdClass.

不幸的是,在添加类映射时,结果仍然完全相同..包含vps和共享属性的stdClass.预期结果将是包含vps和共享属性的Soho_Soap_DataObject_Packages对象.

这是使用过的SoapClient代码:https: //www.dropbox.com/s/ulnni84p8dawv97/SoapClient.txt

当我通过Soap调用getPackages方法时,我得到以下内容:

$SoapClient = \Soho_Soap_Client::getInstance();
$packages = $SoapClient->getPackages();
print_r($packages);
Run Code Online (Sandbox Code Playgroud)

输出:

stdClass Object
(
[shared] => Array
    (
        [0] => stdClass Object
            (
                [id] => 
                [title] => 
                [pricePerPeriod] => 
                [price] => 
                [minRegistrationMonths] => 
                [properties] => 
                [options] => Array
                    (
                    )
            )
    )
[vps] => 
Run Code Online (Sandbox Code Playgroud)

)

但是,如果我查看响应类型,我会得到以下内容:

print_r( $SoapClient->__getTypes() );
Run Code Online (Sandbox Code Playgroud)

输出:

    Array
    (
    [0] => Soho_Soap_DataObject_Package_Shared ArrayOfSoho_Soap_DataObject_Package_Shared[]
    [1] => struct stdClass {

    }
    [2] => Soho_Soap_DataObject_Package_Shared_Option ArrayOfSoho_Soap_DataObject_Package_Shared_Option[]
    [3] => struct Soho_Soap_DataObject_Package_Shared_Option {
        string title;
        string value;
    }
    [4] => struct Soho_Soap_DataObject_Package_Shared {
        int id;
        string title;
        int pricePerPeriod;
        int price;
        int minRegistrationMonths;
        stdClass properties;
        ArrayOfSoho_Soap_DataObject_Package_Shared_Option options;
    }
    [5] => Soho_Soap_DataObject_Package_Vps ArrayOfSoho_Soap_DataObject_Package_Vps[]
    [6] => Soho_Soap_DataObject_Package_Vps_Option ArrayOfSoho_Soap_DataObject_Package_Vps_Option[]
    [7] => struct Soho_Soap_DataObject_Package_Vps_Option {
        string title;
        string value;
    }
    [8] => struct Soho_Soap_DataObject_Package_Vps {
        int id;
        string title;
        int pricePerPeriod;
        int price;
        int minRegistrationMonths;
        stdClass properties;
        ArrayOfSoho_Soap_DataObject_Package_Vps_Option options;
    }
    [9] => struct Soho_Soap_DataObject_Packages {
        ArrayOfSoho_Soap_DataObject_Package_Shared shared;
        ArrayOfSoho_Soap_DataObject_Package_Vps vps;
    }
    )        
Run Code Online (Sandbox Code Playgroud)

谷歌并没有对我提供太多帮助,因为类比映射的文档化并不是一件好事,所以我希望堆栈社区可以解决我的问题.

2天盯着同样的问题让我绝望.

不久之前,我以同样的方式使用SoapClient与vmware vsphere API进行通信,该API运行良好,所以我认为问题与WDSL有关,但目前我迷路了.

我感谢大家花时间提前查看我的问题.我会在要求时提供额外的信息.

小智 9

在查看代码时,有一件事会跳出来,那就是zend_soap_server实例应该使用它自己的WSDL,如下所示:

$SoapServer = new Zend_Soap_Server($urltowsdl, array('classmap' => $classmap));
Run Code Online (Sandbox Code Playgroud)