php - Zend SOAP: Change the default array element name "item" to class name of complex type in WSDL -


this question might asked, hard search for, can not find it. plus not easy ask.

i'm using zend soap's autodiscover re-create our old soap interface (because of switching micro services , re-working everything).

so far it's working charm. have 1 problem in recreating soap response of services when using lists/arrays.

the old response xml of soap request looked this. contains 2 <smsentry>s in <smsentries> list.

<soap-env:envelope>    <soap-env:body>       <ns1:getsmsbytimespanresult>          <amountofentries>2</amountofentries>          <smsentries>             <smsentry></smsentry>             <smsentry></smsentry>          </smsentries>       </ns1:getsmsbytimespanresult>    </soap-env:body> </soap-env:envelope> 

but recreated response looks this. contains 2 <item>s of type smsentry in <smsentries> list.

<soap-env:envelope>    <soap-env:body>       <ns1:getsmsbytimespanresponse>          <return xsi:type="ns1:getsmsbytimespanresponse">             <amountofentries xsi:type="xsd:int">2</amountofentries>             <smsentries soap-enc:arraytype="ns1:smsentry[2]" xsi:type="ns1:arrayofsmsentry">                <item xsi:type="ns1:smsentry"></item>                <item xsi:type="ns1:smsentry"></item>             </smsentries>             <dataex xsi:nil="true"/>          </return>       </ns1:getsmsbytimespanresponse>    </soap-env:body> </soap-env:envelope> 

i have no control of clients. might checking smsentry comparing string. want use class name smsentry xml-tag name.

second, leave out additional, wrapping everything, <return> tag.

i using autodiscover this:

use zend\soap\autodiscover; use zend\soap\wsdl\complextypestrategy\arrayoftypecomplex;  $autodiscover = new autodiscover(new arrayoftypecomplex()); $autodiscover->setclass(new standard($sm)); 

the getsmsbytimespanresponse defined this:

standard.php

/**  * class getsmsbytimespanresponse  *  * @package lgxservicemanager\service  */ class getsmsbytimespanresponse {     /**      * @var int      */     public $amountofentries;      /**      * @var \lgxservicemanager\service\smsentry[]      */     public $smsentries; }  /**  * class smsentry  *  * @package lgxservicemanager\service  */ class smsentry { } 

does have idea on how this?

i found code in library\zend\soap\wsdl\complextypestrategy\arrayoftypesequence.php:122 _addsequencetype() method setting attribute hardcoded:

$element->setattribute('name', 'item'); 

but in type "sequence" not type "complex" i'm using...

thank in advance, philipp


\edit

oh man... discovered structure don't know how create zend soap's autodiscover...

 <mainmember1>serialnumber</mainmember1>  <mainmember2>nameofproduct</mainmember2>  <mainmember3>000000-000-0</mainmember3>  <rules>     <ruleentry>        <singlevalue>allow</singlevalue>        <resourcelist>           <name>generic</name>           <resourceentry>[...]</resourceentry>           <resourceentry>[...]</resourceentry>           <resourceentry>[...]</resourceentry>        </resourcelist>        <resourcelist>           <name>default</name>           <resourceentry>[...]</resourceentry>           <resourceentry>[...]</resourceentry>           <resourceentry>[...]</resourceentry>        </resourcelist>     </ruleentry>  </rules> 

as can see, there <singlevalue> inside <ruleentry> multiple <resourcelist>s. same structure used inside resource lists: 1 <name> , multiple <resourceentry>...

is possible handle autodiscover?

for still having above problem: default response of stdclass() this:

$array = ['lets', 'test', 'it']; $response = new stdclass(); $response->results = $array; 

will like:

 <return xsi:type="soap-enc:struct">     <results soap-enc:arraytype="xsd:string[3]" xsi:type="soap-enc:array">        <item xsi:type="xsd:string">lets</item>        <item xsi:type="xsd:string">test</item>        <item xsi:type="xsd:string">it</item>     </results>  </return> 

what can - can change array arrayobject():

    $array = ['lets', 'test', 'it'];      $response = new stdclass();     $response->results = new arrayobject();     foreach($array $item) {       $response->results->append($item);     } 

which return:

         <return xsi:type="soap-enc:struct">             <results xsi:type="soap-enc:struct">                <bogus xsi:type="xsd:string">lets</bogus>                <bogus xsi:type="xsd:string">test</bogus>                <bogus xsi:type="xsd:string">it</bogus>             </results>          </return> 

and icing on cake:

$array = ['lets', 'test', 'it'];  $response = new stdclass(); $response->results = new arrayobject(); foreach($array $item) {     $soapvar = new soapvar($item,xsd_string,null,null,'result');     $response->results->append($soapvar); } 

it return:

 <return xsi:type="soap-enc:struct">     <results xsi:type="soap-enc:struct">        <result xsi:type="xsd:string">lets</result>        <result xsi:type="xsd:string">test</result>        <result xsi:type="xsd:string">it</result>     </results>  </return> 

as can see fifth argument tells key of xml element. need aware of second argument too, becaouse tells type of variable. can find more here: https://secure.php.net/manual/en/class.soapvar.php


Comments

Popular posts from this blog

php - failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request -

java - How to filter a backspace keyboard input -

java - Show Soft Keyboard when EditText Appears -