将wsdl中的任意模式元素与PHP SoapServer一起使用


Using the any schema element in wsdl with PHP SoapServer

我似乎无法使用PHP SoapServer使XSD元素在wsdl中工作。根据我所读到的以及看到的其他几家公司是如何实现"松散类型"的wsdl的。以下内容应足以检索和发送记录信息。

<complexType name="Record">
    <sequence>
        <any namespace="##targetNamespace" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
    </sequence>
</complexType>

不幸的是,php SoapServer类似乎丢弃了任何未严格定义的元素。我得到的是创建请求时的空记录和检索/筛选请求时的发送空记录,尽管这些字段在SoapServer处理之前就已经存在。

如果我专门定义像这样缺失的字段。。。

<complexType name="Record">
    <sequence>
        <element name="FirstName" type="xsd:string" minOccurs="0"/>
        <element name="LastName" type="xsd:string" minOccurs="0"/>
        <any namespace="##targetNamespace" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
    </sequence>
</complexType>

然后一切都很好,这些字段被传递到客户端/从客户端传递。我是不是错过了什么?我已经尝试了所有的名称空间选项##any、##local等以及processContents选项。我只想能够发送/返回记录的额外字段,无论它们是否在模式中详细列出。

您需要在传递给soap响应的返回对象中使用SoapVar对象。在您的情况下,返回的对象应该是这样的。

$recordObject = new stdClass;
$recordObject->prop1 = 'prop1';
$recordObject->prop2 = 'prop2';
$soapReturnObject = new SoapVar($recordObject, SOAP_ENC_OBJECT);

另请参阅:SOAP:返回PHP 中xsd:any元素的数组