ich weiß grundsätzlich nicht, ob hier überhaupt noch mitgelesen wird. Über
ein paar Lebenszeichen würde ich mich freuen.
Noch mehr freuen würde ich mich, wenn mir jemand helfen könnte.
Problem:
Ich habe ein recht komplexes Objekt mit mehreren Relationen (1:n, n:m) und
müsste das nun in einer Session speichern um es weiter zu bearbeiten.
Ein $_SESSION['MEINEINSTANCE']=serialize($object); funktioniert, aber ...
ein $mynewobject=unserialize($_SESSION['MEINEINSTANCE']); liefert nicht das
vollständige Objekt zurück, es fehlen die Relationen.
Woran kann das liegen? Leider finde ich über Google nichts über diese
Problematik.
Danke und Gruß
André
Das einzige was mir hierzu einfällt ist, dass unserialize() nur
funktioniert, wenn die relevanten Klassen vor Aufruf von unserialize()
geladen sind.
Im schlimmsten Fall ein wenig selber forschen und debuggen.
Liebe Grüße
Andreas
--
Kraftl EDV - Dienstleistungen
Linux, Schulungen, Webprogrammierung
http://www.kraftl.at
> ich weiß grundsätzlich nicht, ob hier überhaupt noch mitgelesen wird. Über
> ein paar Lebenszeichen würde ich mich freuen.
Doch, doch ...
> ein $mynewobject=unserialize($_SESSION['MEINEINSTANCE']); liefert nicht das
> vollständige Objekt zurück, es fehlen die Relationen.
>
> Woran kann das liegen? Leider finde ich über Google nichts über diese
> Problematik.
Naja, Tante G. fragen ist gut, Manual lesen ist besser.
"serialize() handles all types, except the resource-type. You can even
serialize() arrays that contain references to itself. Circular
references inside the array/object you are serializing will also be
stored. Any other reference will be lost."[1]
Weiter steht dort:
"When serializing objects, PHP will attempt to call the member function
__sleep prior to serialization. This is to allow the object to do any
last minute clean-up, etc. prior to being serialized. Likewise, when the
object is restored using unserialize() the __wakeup member function is
called."[2]
Also lannst du dir das gewünschte Verhalten nach Belieben mit __sleep()
und __wakeup() bauen.
[1] http://de3.php.net/manual/en/function.serialize.php
[2] ebd.
MfG
Niels
--
| http://www.kolleg.de · Das Portal der Kollegs in Deutschland |
| http://www.bsds.de · BSDS Braczek Software- und DatenSysteme |
| Webdesign · Webhosting · e-Commerce · Joomla! Content Management |
------------------------------------------------------------------
> Andre Schmidt schrieb:
>
>> ich weiß grundsätzlich nicht, ob hier überhaupt noch mitgelesen wird.
>> Über ein paar Lebenszeichen würde ich mich freuen.
>
> Doch, doch ...
Na das ist ja schonmal was...
>
>> ein $mynewobject=unserialize($_SESSION['MEINEINSTANCE']); liefert nicht
>> das vollständige Objekt zurück, es fehlen die Relationen.
>>
>
> Naja, Tante G. fragen ist gut, Manual lesen ist besser.
>
Nun vielen Dank. Hilf aber erstmal nicht weiter.
Das Verhalten von serialize() ist mir bekannt. Nur habe ich bevor ich
Doctrine genutzt habe ebenfalls Objekte mit Arrays auf andere Objekte
serialisiert und das funktionierte wunderbar. (Mit Ausnahme natürlich
Resource Typen, wie z.B. Datenbankverbindungen)
Das Verhalten von Doctrine wundert mich nun in der Tat ein wenig. Ist
Doctrine etwa vom Typ Resource? (und wie finde ich das eventuell raus?)
> Also lannst du dir das gewünschte Verhalten nach Belieben mit __sleep()
> und __wakeup() bauen.
Ja ... aber das hilft gar nichts. Wenn ich ein Objekt nur um eine Relation
erweiter und bevor ich das in der Datenbank speicher erstmal in einer
Session halten möchte (bei XAJAX-Anwendungen ja keine Seltenheit) dann
stehe ich vor einem "kleinen" Problem. Vor allem dann, wenn das
Serialisieren eines Objektes erstmal grundsätzlich (scheinbar) alle
Relationen zum Objekt kappt.
Danke und Gruß
André
>> Also lannst du dir das gewünschte Verhalten nach Belieben mit __sleep()
>> und __wakeup() bauen.
>
> Ja ... aber das hilft gar nichts.
Doch, natürlich hilft das.
> Wenn ich ein Objekt nur um eine Relation
> erweiter und bevor ich das in der Datenbank speicher erstmal in einer
> Session halten möchte (bei XAJAX-Anwendungen ja keine Seltenheit) dann
> stehe ich vor einem "kleinen" Problem. Vor allem dann, wenn das
> Serialisieren eines Objektes erstmal grundsätzlich (scheinbar) alle
> Relationen zum Objekt kappt.
Dann musst du einfach in der __sleep()-Funktion die verknüpften Objekte
ebenfalls serialisieren und dir die Verknüpfung merken; in __wakeup()
stellst du alle Objekte und die Relationen wieder her.
> Dann musst du einfach in der __sleep()-Funktion die verknüpften Objekte
> ebenfalls serialisieren und dir die Verknüpfung merken; in __wakeup()
> stellst du alle Objekte und die Relationen wieder her.
Nunja, "einfach" ist so eine Sache. Mich wundert es hier an dieser Stelle,
warum das eben nicht "einfach" ist, sondern man erst >umständlich<
wieder "Hand" anlegen muss. Ein Objekt in einer Session zwischen zu
speichern ist doch keine Anforderung, die ich als einziger stelle.
Im Moment bin ich auf die Methode Doctrine_Record::toArray() und
Doctrine_Record::fromArray() gestoßen, die scheinbar in meinem Sinne
funktionieren, sofern das um Sessions geht. Nur leider find ich bei einem
wiederherstellten Objekt eine n:m Relation nicht wieder... Jetz muss ich
nochmal prüfen, ob es an Programm liegt oder an Doctrine selbst.
Gruß
André
Hallo,
ich stehe nun vor exakt dem selben Problem. Hat es evtl. jemand lösen
können?
Danke!
Grüße,
Hendrik
Aaaaah, mal kurz in die Record.php geschaut, da findet sich folgende
Funktion:
function serializeReferences($bool = null)...
diese vor dem serialize($object) mit $bool = true aufrufen und schon
gehen die Relations beim de-/serialisieren nicht mehr verloren.
Grüße,
Hendrik