PHP:提供一个名为“echo”的SOAP方法

时间:2012-01-24 12:40:02

标签: php soap echo

我必须通过SOAP提供一个名为“echo”的函数。我不知道怎么做,因为回声已经被PHP重新分配了。有什么办法吗?

BTW:我不能使用rename_function或override_function。 Pecl-Apd在系统中不可用。

以下是一些代码:

PHP:

$soap_server = new SoapServer('service.wsdl');
$soap_server->setClass('TestClass');

$soap_server->handle();
来自service.wsdl的

<message name="echo">
    <part name="parameters" element="tns:echo"/>
  </message>

[...]

<portType name="MyService">
[...]
<operation name="echo">
      <input message="tns:echo"/>
      <output message="tns:echoResponse"/>
    </operation>
[...]
</portType>
<binding name="MyServicePortBinding" type="tns:MyService">
[...]
<operation name="echo">
      <soap:operation soapAction="urn:ping"/>
      <input>
        <soap:body use="literal"/>
      </input>
      <output>
        <soap:body use="literal"/>
      </output>
    </operation>
[...]
</binding>

SOAP-Client不受我的控制。我必须实现给定的wsdl文件。但在我的班级中,总是“回声”调用而不是“ping”并导致错误消息PHP Fatal error: Function 'echo' doesn't exist in <file-path-and-name>

我的TestClass看起来像这样:

<?php

ini_set("soap.wsdl_cache_enabled", "0");

class TestClass {

  public function __construct()
  {

  }

  [...]

  public function ping($inputString)
  {
     return $inputString;
  }

}
?>

2 个答案:

答案 0 :(得分:1)

这完全可行。您创建的类将成为您的请求的“处理程序”,您可以根据需要为方法命名,例如

公共职能myecho(){

}

然后你将不得不创建一个wsdl文件,在那里你将有一个指向你的“myecho”函数的“echo”操作的条目。

在wsdl文件中看起来像这样:

<operation name="echo">
            <soap:operation soapAction="/service/myecho" />
            <input>
                <soap:body use="literal" namespace="/service" />
            </input>
            <output>
                <soap:body use="literal" namespace="/service" />
            </output>
        </operation>

您需要手动创建自己的wsdl文件,这是一个不同的主题。

答案 1 :(得分:1)

最后,我使用代理类解决了问题:

class MySoapProxy
{
  public function __call($methodName, $args) {
    if($methodName == "echo") $methodName = "ping";
    $soapClass = new TestClass();
    $result = call_user_func_array(array($soapClass, $methodName),  $args[0]);
    return array($methodName . 'Result' => $result);
  }
}

我的TestClass:

class TestClass {

  [...]

  public function ping($inputString)
  {
     return $inputString;
  }

}

SoapServer看起来像这样:

$soap_server = new SoapServer('myservice.wsdl');
$soap_server->setClass('MySoapProxy');

$soap_server->handle();