2012-01-24 2 views
1

Я должен предоставить функцию через SOAP, которая называется «эхо». Я не знаю, как это сделать, потому что эхо уже перезагружено PHP. Там в любом случае?PHP: Предоставьте SOAP-метод под названием «echo»

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> 

мыльный клиент не находится под моим контролем. Я должен реализовать данный 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

Можете ли вы дать некоторую предысторию вопрос - это, например, домашнее задание на исследование? Я предполагаю, что вы хотите использовать SOAP-метод, называемый 'echo', а не переопределять основные функции PHP? :) – halfer

+0

@halfer FYI Я удалил свой ответ, потому что ни один из моих подходов не работал в любом случае :(- хотя вы также можете быть правы, и я, возможно, неправильно интерпретировал этот вопрос. – DaveRandom

+0

@halfer да извините, мне нужен SOAP-метод под названием «эхо», Я думаю, что не имеет значения, как это имя функции. – virusbrain

ответ

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(); 
1

Это полностью выполнимо. Вы можете создать свой класс, который будет «Handler» для ваших запросов, имя вашего метода, что вы хотите, например

общественная функция myecho() {

}

Тогда вам придется создать wsdl, и здесь вы будете иметь запись для операции «эхо», которая указывает на вашу функцию «myecho».

Это будет выглядеть примерно так, как это в вашем файле 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 вручную, это другая тема.

+0

хорошо, это хорошая идея.я пробовал: '<операция имя = "эхо"> <мыло: операция SOAPAction = "asdfhlasdjkfhasdkjfh"/> <мыло: использование тела = "буквальным"/> <мыло: использование тела =» буквальное "/> ', но я получаю всегда следующее сообщение об ошибке: 'PHP Фатальная ошибка: функция„эхо“не exist' – virusbrain

+0

@virusbrain - опять-таки, мы должны видеть код, который вы используете , Измените исходный вопрос и добавьте его в конце. – halfer

+0

@halfer благодарит за ваше время. Я сделал это. – virusbrain

Смежные вопросы