sfAMFPlugin & Propel Custom Properties

Das SfAmfPlugin ist ein Symfony-Plugin, welches auf SabreAMF aufsetzt, einer PHP-Bibliothek, die –  yessir! – zur Kommunikation mit einem Flash/Flex Remote Client via AMF-Protokoll konzipiert wurde.

Nun bietet SabreAMF ab Werk “nur” Serialisierungen für primitive Typen sowie Bytestreams (Flash-Pendant “ByteArray”) und PHP-Array (“ArrayCollection”) an. Natürlich kann man auch Objekte per Class-Mapping auf ein Äquivalent im Flash-Player abbilden.

Das Symfony-Plugin setzt noch einen drauf und bietet mehrere Adapterklassen, die es ermöglichen, ohne Aufwand Propel-Persistenzobjekte sowie Instanzen von DoctrineCollection und einzelnen Doctrine-Models zu serialisieren.

Im Falle Propel geschieht das Mapping via Reflection-API, durch die festgestellt wird, ob die übergebene Instanz von X das Interface “Persistent” implementiert. Reflection? Klingt unheimlich ausgefuchst. Dumm nur, dass ihr Einsatz damit auch schon beendet ist. Denn sobald die Instanz als ich sag’ mal Plain Old Propel Object (“Popel” :D) identifiziert wurde, greift sich das Plugin durch die toArray()-Methode die gespeicherten Eigenschaften.

Wobei natürlich nur diejenigen auch korrekt serialisiert werden, die zu diesem  Zeitpunkt bereits geladen wurden. Und custom-properties erst gar nicht berücksichtigt werden. Und Fk-Beziehungen erst recht nicht.

Die Lösung gegen frühzeitige Nervenzusammenbrüche (einen AMF-Service zu debuggen ist ja auch so eine Sache) ist natürlich – wenn man es weiß – : Die toArray() Methode einfach überschreiben bzw. erweitern um die Objekteigenschaften, die man via AMF mitschicken möchte. (Bitte mögliche Seiteneffekte im Sourcecode vorher gründlich abklopfen! Ich übernehme keine Haftung bei spontaner Selbstentzündung!)

Schade, dass sfAmfPlugin so derbst schlecht dokumentiert ist und gerade über die Serialisierung wenig bis gar keine Worte verloren werden. Ansonsten ist das Teil ja wirklich nett.

3 Replies to “sfAMFPlugin & Propel Custom Properties”

Leave a Reply

Your email address will not be published. Required fields are marked *