如何更改Zend Soap Server中的响应函数名称?

时间:2017-01-13 10:31:10

标签: php soap zend-framework wsdl

我正在生成WSDL,我需要更改响应中的函数名称以匹配客户端的名称(我无法控制)。

这是我得到的WSDL响应:

<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://localhost:8000/soap/index.php?wsdl" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
   <SOAP-ENV:Body>
      <ns1:fooFunctionResponse>
         <return xsi:type="xsd:boolean">true</return>
      </ns1:fooFunctionResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

我需要第<ns1:fooFunctionResponse>行来阅读<ns1:fooFunctionAcknowledgement>

这是我的肥皂服务器:

if (isset($_GET['wsdl'])) {
    ini_set('soap.wsdl_cache_enabled', 0);
     $soapAutoDiscover = new \Zend\Soap\AutoDiscover(new \Zend\Soap\Wsdl\ComplexTypeStrategy\ArrayOfTypeSequence());
     $soapAutoDiscover->setBindingStyle(array('style' => 'document'));
     $soapAutoDiscover->setOperationBodyStyle(array('use' => 'literal'));
     $soapAutoDiscover->setClass('SoapFunction');
     $soapAutoDiscover->setUri(http://localhost:8000/soap/index.php);
     $soapAutoDiscover->handle();
} else {
    $soap = new \Zend\Soap\Server(null, array("soap_version" => SOAP_1_2, 'uri' => 'http://localhost:8000/soap/index.php?wsdl',  'classmap' => array('Identification', 'RemoteIdentification')));
    $soap->setClass('SoapFunction');
    $soap->handle();
}

我在Zend框架(Autodiscover.php第514行)中找到了这行代码,它看起来像是控制了函数的命名:

$element = [
    'name'      => $functionName . 'Response',
    'sequence'  => $sequence
];

但是改变它什么都不做,永远不会调用父方法。我不知道如何解决这个问题,请帮忙。

我发现此行确实更改了函数名称,但是我使用SoapUI来测试我的API,而从SoapUI我总是看到Response而不是无论我将字符串更改为。在Chrome中,我看到Acknowledgement

为什么SoapUI显示不同的函数名称?

1 个答案:

答案 0 :(得分:0)

我对Zend Framework和/或它的结构了解不多。但我认为您可以简单地扩展包含response()方法的类并覆盖该方法。

// Example Zend Class
class Zend_Class {

    public function response()
    {
        // ...
    }
}

// Your own Class
class Own_Class extends Zend_Class
{
    public function ResponseBoohoo()
    {
        return parent::response();
    }
}

如果我完全和完全误解了你,我道歉。 :)