我似乎无法使用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元素的数组