2010年1月27日星期三

[fw-webservices] Re: Recursion issue with Zend_Soap_AutoDiscovery.

2010/1/25 Richard Quadling <rquadling@googlemail.com>:
> Hi.
>
> I'm in the process of building a web service which incorporates the
> ability for the server to inform the client that a particular call has
> been superseded by another.
>
> So, cut down (I've removed all the other details), ...
>
> class ServiceDetails
>        {
>        /**
>         * Superseded by
>         *
>         * Details of the replacement service that is now available.
>         *
>         * @var ServiceDetails
>         */
>        public $SupersededBy = Null;
>        }
>
> When I try to use Zend_Soap_AutoDiscover() against this class, I get ...
>
> "Infinite recursion, cannot nest 'ServiceDetails' into itsself." (sic)
>
> There has to be recursion, as there could be many levels of
> supersedence, each one providing the details of their own replacement.
>
> The call to return the service details read the requested
> services/class constants. If there is a superseded entry, it creates a
> new request for service details on the new class (the recursion).
>
> If the value is Null, then there is no recursion.
>
>
>
> I'm using ...
>
> new Zend_Soap_AutoDiscover('Zend_Soap_Wsdl_Strategy_ArrayOfTypeComplex');
>
> as the strategy as the service has arrays of complex types in the output.
>
>
>
> If I use @var string and then manually replace the type in the WSDL
> file from ...
>
>          <xsd:element name="SupersededBy" type="xsd:string" />
>
> to
>
>          <xsd:element name="SupersededBy" type="tns:ServiceDetails" />
>
> and use wsdl2php against this, it all _SEEMS_ to work OK.
>
> So. Is this my best option? Or is there a way to do this that I'm missing?
>
>
> Any ideas really.
>
>
> Is this even a bug in the Zend_Soap_AutoDiscover class?
>
>
>
> Regards,
>
> Richard Quadling.
>
>
>
>
> --
> -----
> Richard Quadling
> "Standing on the shoulders of some very clever giants!"
> EE : http://www.experts-exchange.com/M_248814.html
> EE4Free : http://www.experts-exchange.com/becomeAnExpert.jsp
> Zend Certified Engineer : http://zend.com/zce.php?c=ZEND002498&r=213474731
> ZOPA : http://uk.zopa.com/member/RQuadling
>

I amended Zend_Soap_Wsdl_Strategy_ArrayOfTypeComplex::addComplexType().

Changing the (sic) ...

throw new Zend_Soap_Wsdl_Exception("Infinite recursion, cannot nest
'".$type."' into itsself.");

to ...

return "tns:$type";

and all is working just fine.

Obviously, I may be breaking something here, but I've not come across
it yet. Early days .... !

--
-----
Richard Quadling
"Standing on the shoulders of some very clever giants!"
EE : http://www.experts-exchange.com/M_248814.html
EE4Free : http://www.experts-exchange.com/becomeAnExpert.jsp
Zend Certified Engineer : http://zend.com/zce.php?c=ZEND002498&r=213474731
ZOPA : http://uk.zopa.com/member/RQuadling

没有评论: