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
Post a Comment