2009-07-23 13 views
3

私は比較的「サービス面を作る」ということでSoapを使い慣れています。PHP SoapServerからPHP配列を返す

PHPのSoapServerクラスを使用してセットアップされたリモートプロシージャーソープサービスからPHP配列を返すことはできますか?

私は(盲目的チュートリアルに従うことによって構築された)WSDLの部分で、この

<message name='genericString'> 
    <part name='Result' type='xsd:string'/> 
</message> 

<message name='genericObject'> 
    <part name='Result' type='xsd:object'/> 
</message> 

<portType name='FtaPortType'>  
    <operation name='query'> 
     <input message='tns:genericString'/> 
     <output message='tns:genericObject'/> 
    </operation>   
</portType> 

ようになり、ことを私が呼んでいるPHPの方法は、クエリの名前、およびこの

ようになりますされている

public function query($arg){ 
    $object = new stdClass(); 
    $object->testing = $arg; 
    return $object;  
} 

これは私がようになります

$client = new SoapClient("http://example.com/my.wsdl"); 
$result = $client->query('This is a test'); 

と結果のダンプを呼び出すことができます

object(stdClass)[2] 
    public 'result' => string 'This is a test' (length=18) 

私のクエリメソッドからネイティブのPHP配列/コレクションを返したいとします。クエリメソッドを変更して配列を返す場合

public function query($arg) { 
    $object = array('test','again'); 
    return $object; 
} 

クライアント側のオブジェクトにシリアル化されています。

object(stdClass)[2] 
    public 'item' => 
     array 
      0 => string 'test' (length=4) 
      1 => string 'again' (length=5) 

私は私のWSDLの結果の型としてxsd:object特定しましたので、これは、理にかなっています。可能であれば、ObjectでラップされていないネイティブPHP配列を返すようにしたいと思います。私の本能は、これを実現する特定のxsd:タイプがあると言いますが、わかりません。私はまた、ArrayObjectとしてシリアル化されているオブジェクトを解決します。

技術的な詳細については、WSDLを教えてください。私は基本的な概念を把握しようとしています

答えて

2

説明ファイルを作成するのにthis WSDL generatorを使用しました。文字列の配列を返す

が自分のWebサービスが何をするか何かで、ここではWSDLの一部です:

<wsdl:types> 
<xsd:schema targetNamespace="http://schema.example.com"> 
    <xsd:complexType name="stringArray"> 
    <xsd:complexContent> 
     <xsd:restriction base="SOAP-ENC:Array"> 
     <xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="xsd:string[]" /> 
     </xsd:restriction> 
    </xsd:complexContent> 
    </xsd:complexType> 
</xsd:schema> 

</wsdl:types> 
<message name="notifyRequest"> 
    <part name="parameters" type="xsd:string" /> 
</message> 
<message name="notifyResponse"> 
    <part name="notifyReturn" type="tns:stringArray" /> 
</message> 

そして、API関数notifyが定義されている:

<wsdl:operation name="notify"> 
    <wsdl:input message="tns:notifyRequest" /> 
    <wsdl:output message="tns:notifyResponse" /> 
</wsdl:operation> 
0

アラン、あなたのクライアントが応答を受け取ったときに、オブジェクトを配列としてキャストしてみませんか?

(array) $object; 

これはあなたはstdClassオブジェクトを配列に変換され、そここれには測定オーバ​​ーヘッドはなく、PHPにO(1)です。

タイプをxsd:objectからsoap-enc:Arrayに変更してみてください。

+1

2つの理由。それは私の配列を含む "item"という名前の単一のキーを持つ配列を与え、より重要なのは、エンドユーザーが使用できるサービスを作成し、それをキャストすることなく配列を取得したいということです。 –

+0

soap-enc:Arrayはあなたのニーズに合っていませんか? – hobodave

+3

これは再帰的に変換されないことに注意してください。したがって、stdClassオブジェクトがレスポンスの深いレベルにある場合、変換されません。この場合、私が考えることができる唯一の方法は、lubosdzの答えです。 – flu

5

リトルトリック - エンコードJSONオブジェクトとして、再帰的連想配列にデコードする:

$data = json_decode(json_encode($data), true); 
+0

既にこれについて知っていましたが、あなたは正しい場所に私を思い出させました!ありがとう:-) – Forbesmyester