SoapClient: как передать несколько элементов с тем же именем?

У меня есть следующий код:

$telnums = array(10, 20, 30); $obj = new StdClass(); $obj->telnums = new StdClass(); foreach ($telnums as $telnum) { $obj->telnums = $telnum; } call_user_func(array($this->client, 'createDomain'), new SoapVar($obj, SOAP_ENC_OBJECT)); 

Там $ this-> client – это экземпляр класса SoapClient.

И он генерирует следующий запрос:

 <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="..."> <SOAP-ENV:Body> <ns1:createDomain> <createDomainRequest> <telnums>30</telnums> </createDomainRequest> </ns1:createDomain> </SOAP-ENV:Body> </SOAP-ENV:Envelope> 

Но мне нужно

  <createDomainRequest> <telnums>10</telnums> <telnums>20</telnums> <telnums>30</telnums> </createDomainRequest> 

Как я могу это достичь?

PS: PHP 5.2.6-3ubuntu4.5 с Suhosin-Patch 0.9.6.2 (cli) (построено: 6 января 2010 22:25:33)

Заранее спасибо!

Недавно я попал в похожий сценарий, и я обнаружил, что этот шаблон обычно делает трюк.

 $obj = new StdClass(); foreach ($telnums as $telnum) { $obj->telnums[] = $telnum; } 

Причина этого в том, что она тесно эмулирует ту же структуру данных, что и ваш WSDL

Правильный ответ должен был быть:

 $options = array( 'createDomainRequest' => array( 'telnums' => array( '10', '20', '30' ) ) ); 

🙂

Это боль в ягодице, чтобы найти рабочее решение, но в конечном итоге это не так сложно. Даже удивительно легко и аккуратно, используя SoapParam's:

 $soapClient = new SoapClient($wsdl); $soapClient->__call('createDomain', array( new SoapParam('10', 'telnums'), new SoapParam('20', 'telnums'), new SoapParam('30', 'telnums'), )); 

Вот код, который я использовал:

 $wsdl = 'https://your.api/path?wsdl'; $client = new SoapClient($wsdl); $multipleSearchValues = [1, 2, 3, 4]; $queryData = ['yourFieldName' => $multipleSearchValues]; $results = $client->YourApiMethod($queryData); print_r($results); 

Исправлено его, расширяет SoapClient и переопределяет метод __doRequest (), где я изменяю запрос как descibed здесь: http://www.php.net/manual/en/soapclient.dorequest.php#57995

Для меня ужасно страшно, но он работает «прямо здесь, прямо сейчас».

 $telnums=array(10, 20, 30); $createDomainRequest=array('createDomainRequest' => array( 'telnums' => $telnums) );