Zend_SOAP无法使用2个具有相同名称的PHP类生成WSDL

时间:2014-08-28 12:34:34

标签: php xml zend-framework soap zend-soap

我必须遵循WSDL规范为SOAP生成一个PHP类,这个WSDL有两个不同的复杂类型,如下所示(一个叫#34; method1"另一个" Method1" ):

<xs:complexType name="method1">
    <xs:sequence>
      <xs:element minOccurs="0" name="return" type="tns:Method1"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="Method1">
    <xs:sequence>
      <xs:element name="name" type="xs:long"/>
      <xs:any namespace="##other" processContents="lax"/>
    </xs:sequence>
  </xs:complexType>

因此,PHP类会像这样生成,但我会得到错误&#34;文档末尾的额外内容&#34;执行Web服务时,因为这两个类具有相同的名称。

class method1 {
    /** @var Method1 */
        var $return;
}

class Method1 {
    /** @var int */
    var $name = '';
    /** @var mixed */
    var $any = '';
}

有什么方法可以解决这个问题?问题是我必须遵循另一家公司的WSDL规范,因此它应该具有这两种复杂类型。感谢

1 个答案:

答案 0 :(得分:1)

您不需要将PHP类命名为与WSDL中的复杂类型相同。事实上,我故意不这样做,因为类名必须符合我自己的(基于PSR)架构,以实现自动加载和编码风格。

这里有一个很好的功能:SOAP客户端中的classmap选项。这会将SOAP请求和响应中的每个所需复杂类型映射到表示它的PHP类。

您可以这样使用它:

$client = new SoapClient(
    $wsdl, 
    array(
        'classmap' => array(
            'method1' => 'YourLowercaseMethod1Class',
            'Method1' => 'YourInitialCapsMethod1Class',
        )
    )
);

如果你这样做,你获得的任何响应都不会对这些复杂类型使用默认的stdClass,而是定义的PHP类,它允许在自动完成方面获得史诗般的胜利。