我必须通过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;
}
}
?>
答案 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();