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 (die 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 in der wsdl das ist nicht in der Klasse.SOAP-Clients fehlertoleranter machen, wenn Klassenzuordnung verwendet wird
Ich habe versucht, es zu umgehen, indem Sie einen magischen Getter und Rückgabe von Dingen wie false
, null
etc, aber da sie keine gültigen Werte gemäß der WSDL sind, es immer noch einen schwerwiegenden Fehler wirft.
In einer idealen Welt würde der Client diese neue Eigenschaft nur auf das Objekt setzen, auch wenn keine Eigenschaft für die Klasse definiert ist, ist das möglich? Es wäre auch gut, den Fehler nicht einfach zu unterdrücken.
Die Karte Klasse sollte die SOAP-Codierung Fehler nicht verursachen. Mögliche Ursache könnte WSDL im Cache sein - versuchen Sie, den WSDL-Cache zu leeren, holen Sie neue WSDL vom Provider und sehen Sie, ob das Problem weiterhin besteht. – jpaljasma
, die es leider nicht beheben, scheint das Problem zu sein, dass die WSDL bestimmte Werte für den neuen Feldtyp erfordert. Wenn das Feld fehlt, wird standardmäßig "' "angezeigt, was keine gültige Option ist. – pogo
__get() magische Methode wird nicht helfen, weil SOAP keine Variablen fragt, sondern var_export() oder ähnliches (interne Funktion) verwendet. Und dieses Problem ist nicht mit PHP - Sie würden die gleiche Situation mit Java bekommen. Die einzige Möglichkeit besteht darin, konkrete Regeln zum Auslösen eines Fehlers einzurichten, die Sie benachrichtigen, wenn sich WSDL ändert, damit Sie Ihre Klassen anpassen und den fehlenden Parameter hinzufügen können. – jpaljasma