Ich schreibe einen PHP-Wrapper für einen SOAP-Service und verwende die Class-Map-Option, damit ich mit Objekten statt mit Arrays arbeiten kann. Das funktioniert großartig, bis der Provider des SOAP-Dienstes beschließt, einem seiner Objekte eine neue Eigenschaft hinzuzufügen (was sie gerne tun, ohne es jemandem mitzuteilen), zu welchem Zeitpunkt der SOAP-Client mit dem Fehler SOAP-ERROR: Encoding: object has no 'NewlyAddedProperty' property
bricht, da es jetzt eine Eigenschaft gibt in der WSDL, die nicht in der Klasse ist.
Ich habe versucht, es zu umgehen, indem ich einen magischen Getter benutze und Dinge wie false
, null
usw. zurücksende, aber da sie keine gültigen Werte gemäß der WSDL sind, gibt es immer noch einen fatalen Fehler.
In einer idealen Welt würde der Client diese neue Eigenschaft nur dann auf das Objekt setzen, wenn in der Klasse keine Eigenschaft definiert ist, ist das möglich? Wenn es nicht nur wäre, den Fehler zu unterdrücken, wäre das auch in Ordnung.
Sie können die Klassenzuordnung von SoapClient
entfernen und eine andere verwenden, z. B. jsonmapper .
Wenn Ihre Klassen korrekt kommentiert sind, ist es so einfach wie in diesem Beispiel:
%Vor%SOAP bedeutet XML über HTTP - der Besitzer des SOAP-Dienstes kann und sollte nicht alle Systeme kennen, die ihn aufrufen.
Diese Sprödigkeit ist in die SOAP-Schnittstelle integriert. Der Dienst sollte eingehende Anforderungen anhand seines Schemas überprüfen. Es wird fehlschlagen, es sei denn, sie machen diesen Pfad optional. Es ist keine "Ente tippen" eingebaut.