SOAP mit PHP
Die SOAP-Schnittstelle von PHP ist eine tolle Sache. Ihr Aufbau ist durchdacht und einfach zu verstehen. Als Entwickler kann man mit sehr wenigen Zeilen wirklich viel erreichen und es wird einem die gesamte XML-Ebene eines Zugriffs erspart. Leider gibt es aber ein großes Manko: die mangelhafte Dokumenation für die Datenübergabe. Die Beispiele auf php.net enthalten nur ganz einfache Strukturen, und keine Complex Types mit Attributen, gleichen Elementnamen auf derselben Ebene etc.
Im Zuge eines großen Shop-Projekts musste ich mich tiefer in die Schnittstelle einarbeiten und immer wieder stundenlang in den entsprechenden Kommentaren auf php.net oder via Suchmaschine recherchieren bzw. hirnlos rumprobieren, weil bei der Suche nichts sinnvolles rauskam. Daher nun an dieser Stelle ein paar einfache Beispiele, bestehend aus der XML-Struktur (den SOAP-Envelope spare ich mir) und dem entsprechenden Array-Aufbau.
Attribute
Gewünschtes XML:
<basket>
<item id="1" value="499">Apple iPad WiFi 16 GB</item>
</basket>
PHP-Array:
Array
(
[basket] => Array
(
[item] => Array
(
[_] => >Apple iPad WiFi 16 GB
[id] => 1
[value] => 499
)
)
)
Elemente mit gleichen Namen in der derselben Ebene
An obigem Beispiel erkennt man, dass die Elementnamen über die Array-Schlüssel festgelegt werden. Möchte man nun mehrere Elemente mit dem gleichen Namen in derselben Ebene haben, wird daraus nichts, weil sie sich gegenseitig überschreiben würden. Daher werden kommt um die Elemente noch ein weiteres, nun aber numerisches Array.
Gewünschtes XML:
<basket>
<item id="1" value="499">Apple iPad WiFi 16 GB</item>
<item id="2" value="999">Apple MacBook</item>
</basket>
PHP-Array:
Array
(
[basket] => Array
(
[0] => Array
(
[item] => Array
(
[_] => Apple iPad WiFi 16 GB
[id] => 1
[value] => 499
)
)
[1] => Array
(
[item] => Array
(
[_] => Apple MacBook
[id] => 2
[value] => 999
)
)
)
)
Element mit Attributen und Kinder-Elementen
Gewünschtes XML:
<basket date="2010-05-23">
<items>
<item id="1" value="499">Apple iPad WiFi 16 GB</item>
<item id="2" value="999">Apple MacBook</item>
</items>
</basket>
PHP-Array:
Array
(
[basket] => Array
(
[date] => 2010-05-23
[items] => Array
(
[0] => Array
(
[item] => Array
(
[_] => Apple iPad WiFi 16 GB
[id] => 1
[value] => 499
)
)
[1] => Array
(
[item] => Array
(
[_] => Apple MacBook
[id] => 2
[value] => 999
)
)
)
)
)
Ich hoffe, dass ich mit diesen einfachen Beispielen einigen Entwicklern die lästige Sucherei bzw. das Rumprobieren ersparen konnte.