如何通过Zend_Soap_Client发送复杂类型?

时间:2012-01-03 10:36:35

标签: php zend-framework soap

我想使用Zend_Soap_Client调用Web服务。这是相关的代码:

    $params = new stdClass();
    $params->transactionId = $transactionId;
    $params->transactionState = $transactionState;
    $params->details = $transactionDetails;
    var_dump($params->details);
    try {
        $this->_soapClient->updateTransaction($params);
    }

问题在于details参数,它是WSDL中的复杂类型。 $transactionDetails包含一个包含复杂类型(非空)元素的数组,这在var_dump()中可见。以前,我尝试使用带有元素作为属性的PHP类。在这两种情况下,SOAP客户端实际发送的是:

<SOAP-ENV:Body>
    <ns1:UpdateTransactionRequest>
        <transactionId>45</transactionId>
        <transactionState>SUCCESS</transactionState>
        <details/>
    </ns1:UpdateTransactionRequest>
</SOAP-ENV:Body>

我做错了什么?

UPDATE:我认为问题的原因是为parmeter声明的complexType是一个基类型,WSDL中存在几种扩展类型,我想使用其中一种扩展类型。我猜Zend_Soap_Client无法识别基类型中不存在的任何元素,这些元素都是它们。有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

解决方案在于标准的PHP SOAP客户端,Zend_Soap_Client扩展。 SoapVar类允许您包装参数并指定要使用的实际类型。我要做的就是回到使用$transactionDetails的PHP类和这段代码:

$params->details = new SoapVar($transactionDetails, 
    SOAP_ENC_OBJECT, get_class($transactionDetails), $namespace);