2012-01-24 7 views
1

"echo"というSOAPを介して関数を提供する必要があります。エコーはすでにPHPによって再調査されているので、私はこれを行う方法を知らない。何か方法はありますか?PHP: "echo"というSOAPメソッドを提供する

私は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-fileを実装する必要があります。しかし、私のクラスでは常に "echo"は "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

あなたはにいくつかの背景を与えることができます質問 - これは研究の宿題ですか? PHPコア関数を再定義するのではなく、 'echo'というSOAPメソッドがほしいと思っていますか? :) – halfer

+0

@halfer FYI私のアプローチがとにかく働いていなかったので私の答えを削除しました:(あなたも正しいかもしれませんが、私は間違った質問を解釈しているかもしれませんが) – DaveRandom

+0

@halfer yes申し訳ありません、 – virusbrain

答えて

1

は最後に、私は、プロキシクラスを使用して問題解決

class TestClass { 

    [...] 

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

} 

をとのSoapServerは、次のようになります

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

$soap_server->handle(); 
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ファイルを作成する必要があります、これは別のトピックです。

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を::

+0

大丈夫です。私が試した: '<操作名= "エコー"> 'しかし、私はいつも次のエラーを取得: – virusbrain

+0

@virusbrainをexist'しない関数 『エコー』 - 再び、我々はあなたが使用しているコードを参照してくださいする必要があります: 'PHP致命的なエラーを。元の質問を編集して最後に追加してください。 – halfer

+0

@はあなたの時間のために感謝します。私はそれをやった。 – virusbrain

関連する問題