0

我必须按照 WSDL 规范为 SOAP 生成一个 PHP 类,并且这个 WSDL 有 2 种不同的复杂类型,像这样(一种称为“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 类将像这样生成,但是当执行 Web 服务时,我会收到错误“文档末尾的额外内容”,因为这两个类具有相同的名称。

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

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

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

4

1 回答 1

1

您无需将 PHP 类命名为与 WSDL 中的复杂类型相同的名称。事实上,我不会故意这样做,因为类名必须适合我自己的(基于 PSR 的)模式才能自动加载和编码风格。

这里有一个很好的特性可以提供帮助:SOAP 客户端中的类映射选项。这会将 SOAP 请求和响应中的每个想要的复杂类型映射到表示它的 PHP 类。

你会像这样使用它:

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

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

于 2014-08-30T10:42:04.647 回答