色々とあって、php-soapやってますが、わかったことがあるので載せときます。
たしか、こんな感じにしたと思う。
◆SOAPメッセージの要素を入れ子にする方法(wsdlなし)
$options = array( 'soap_version' => SOAP_1_2, 'location' => 'http://example.net', // SoapServerのURL 'uri' => 'http://example.net/namespace/', // 名前空間のURL 'trace' => true, // トレースOKにするか否か 'exceptions' => false // SoapFault型の例外をスローするか否か ); $obj_soap_client = new SoapClient(null, $options); // wsdlなし、オプションは各自適当にしてネ $ar_children = array( new SoapVar($obj_a, SOAP_ENC_OBJECT, null, null, 'child'), new SoapVar($obj_b, SOAP_ENC_OBJECT, null, null, 'child'), new SoapVar($obj_c, SOAP_ENC_OBJECT, null, null, 'child'), ); $obj_parent = new SoapVar($ar_children, SOAP_ENC_OBJECT, null, null, 'parent'); $response = $obj_soap_client->something($obj_parent); // somethingメソッドはSoapServerで定義されてること
◆もっともっと、入れ子にする方法
$ar_children = array( new SoapVar(3, XSD_INTEGER, null, null, 'number'), new SoapVar(array( new SoapVar(170, XSD_INTEGER, null, null, 'height'), new SoapVar(65, XSD_INTEGER, null, null, 'weight'), new SoapVar('Aさん', XSD_STRING, null, null, 'name'), ), SOAP_ENC_OBJECT, null, null, 'child'), new SoapVar(array( new SoapVar(190, XSD_INTEGER, null, null, 'height'), new SoapVar(100, XSD_INTEGER, null, null, 'weight'), new SoapVar('Bさん', XSD_STRING, null, null, 'name'), ), SOAP_ENC_OBJECT, null, null, 'child'), new SoapVar(array( new SoapVar(175, XSD_INTEGER, null, null, 'height'), new SoapVar(80, XSD_INTEGER, null, null, 'weight'), new SoapVar('Cさん', XSD_STRING, null, null, 'name'), ), SOAP_ENC_OBJECT, null, null, 'child'), ); $obj_parent = new SoapVar($ar_children, SOAP_ENC_OBJECT, null, null, 'parent'); $response = $obj_soap_client->something($obj_parent); // somethingメソッドはSoapServerで定義されてること
◆SoapServerからの戻り値について
なんと、stdClassで戻ってきやがる!
こちらは完全に連想配列のつもりでいたんで(まあこれは俺の完全な思い込みからだけど)、俺が準備したスタブの値(連想配列)で動いていたほかの人のプログラムにもろに支障が出た。うーん、戻り値を配列にするフラグくらいあるだろうと思ってネットで検索したが、めぼしいものは見つからなかった。一応、SoapClientのコンストラクタのオプションで
$options = array( 'features' => SOAP_SINGLE_ELEMENT_ARRAYS );
というのがあったが、これはどうやら戻り値が1つの場合でも配列っぽくするよという意味っぽい(あくまでstdClassのメンバ変数でだろうけど)。
仕方がないので、stdClassを配列にキャストした。
その際、戻り値のみを
$response = (array)$response; // stdClassオブジェクトを配列にキャスト
とした場合、1次元しか配列にキャストされないので、戻り値が多次元の場合、再帰で処理しないといけないことに注意!(再帰のプログラムは先輩が作ってくださった。ありがとうございます!)
php-soapの情報はあんまりなかったので(見つけられなかったので?)、こういうメモが多くの人の役に立つことを祈ります。