yes and if you find a resource or more styled example or post that can clarify this further would be great
On Mon, May 16, 2011 at 9:48 PM, oscar balladares <liebegr...@gmail.com> wrote: > Another issue that I run into is: > Let's say we have object A, and object A has refernce to Object B, both are > entities instances, and reference of B is actually a proxy. > This is the case when retrieving A with the entity manager. The reference of > Object B is a doctrine proxy of Object B actually. > So when serializing A, reference to B will be set to NULL. And this > behaviour is explained in Doctrine Docs. They advice to not to > serialize Entities (that are being managed by an entity manager). > Now I'm facing this problem. Even using \Serializable interface. I read > about a guy that hacked the source code of doctrine (proxies) to > allow serialization but never explained how. > So my big question is: If serializing entities is not adviced, how can I > solve my use case? > I'm implementing a shopping cart, and serializing products entities > instances and saving them in a Session variable. > I hate using arrays when I could achive the same with POO. > But, I must remark that this is a Doctrine/PHP issue not a Symfony Framework > related one. > I'll keep searching. Any usefull information will be posted here to help > someone ;) > 2011/5/16 Luis Cordova <cordo...@gmail.com> >> >> someone has to write about this case more clearly to explain to all >> >> This example is perfect, although one more could be added >> >> Even though is not sf2 related specifically I think that it has to be >> explained since we are going to run into these kind of problems >> >> Thanks >> >> On Mon, May 16, 2011 at 10:43 AM, oscar balladares <liebegr...@gmail.com> >> wrote: >> > Yes, you are right. I hadn't try out the ->detach() method :P Sorry. I >> > saw a >> > tutorial that seemed very convincing :P (it was very late when posted >> > last >> > email and I didn't try it till now). >> > My apologies :F >> > >> > >> > 2011/5/16 Marco Pivetta <ocram...@gmail.com> >> >> >> >> Careful! The entity manager's detach method does not return anything! >> >> Marco Pivetta >> >> @Ocramius >> >> http://marco-pivetta.com >> >> >> >> >> >> >> >> On 16 May 2011 08:55, oscar balladares <liebegr...@gmail.com> wrote: >> >>> >> >>> According what I have read so far, serialize/unserialize $entities >> >>> with >> >>> proxies associations is not advised. >> >>> And of course, if you are saving objects in session() vars, it is an >> >>> innecesary load to save proxies information. >> >>> So, it is adviced to detach proxies from entities (in case where >> >>> entites >> >>> are retrieved with the entity_manager). >> >>> For example: >> >>> public function someControllerAction($product_id) >> >>> { >> >>> $product = $em->find('Vendor\someBundle\Entity\Product', >> >>> $product_id); >> >>> //If you need to save the $product object in a session var, for >> >>> example in a shopping cart implementation, which is actually the one >> >>> that >> >>> // lead me to the issue/solution in first place. >> >>> //so, to detach proxy information from $product you must: >> >>> >> >>> $product = $em->detach($product); >> >>> //then serialize it and save it in a session var. >> >>> } >> >>> >> >>> >> >>> If during unserialization you need the proxy information back, you >> >>> should >> >>> $product = unserialize($SerializedProductContainer); >> >>> $product = $em->merge($product); >> >>> Then you should be able to use proxy information of $product to >> >>> retrieve >> >>> associated entities (Lazy load). >> >>> 2011/5/16 oscar balladares <liebegr...@gmail.com> >> >>>> >> >>>> Hi Luis, I solved the problem. >> >>>> Before making the summary I must point that Tim was reffering to what >> >>>> I >> >>>> thoght was "Serializable" about erroneously, sorry, my fault :D >> >>>> What I found (I have to start reading docs more deeply :P): >> >>>> The PHP bible says: >> >>>> "serialize() checks if your class has a function with the magic >> >>>> name __sleep. If so, that function is executed prior to any >> >>>> serialization. >> >>>> It can clean up the object and is supposed to return an array with >> >>>> the names >> >>>> of all variables of that object that should be serialized. If the >> >>>> method >> >>>> doesn't return anything then NULL is serialized and E_NOTICE is >> >>>> issued." >> >>>> E_NOTICE is what I was getting in dev enviroment when trying to >> >>>> serialize an entity object that has reference to another entity >> >>>> object (due >> >>>> to associations). The serializations succeeded but I was getting that >> >>>> buggy >> >>>> message >:( >> >>>> The PHP bible says: >> >>>> "It is not possible for __sleep to return names of private properties >> >>>> in >> >>>> parent classes. Doing this will result in an E_NOTICE level error. >> >>>> Instead >> >>>> you may use the Serializableinterface." >> >>>> So I found that Doctrine (I think in proxies) use the magic function >> >>>> "__sleep()", so "serialize()" function exectues _sleep() method >> >>>> first, and >> >>>> expect it to return the object's properties, but if they are private >> >>>> it will >> >>>> fail, so if you change them to protected it will succeed. >> >>>> But changing properties scope is clumsy. \Serializable interface is >> >>>> the >> >>>> solution, and this is the "how" IMHO :D >> >>>> Class object implements \Serializable >> >>>> { >> >>>> private $name; >> >>>> private $address = array(); >> >>>> public function serialize() >> >>>> { >> >>>> return $data = array('name' => $this->name, 'address' => >> >>>> $this->address; >> >>>> } >> >>>> public function unserialize($serialized) >> >>>> { >> >>>> $data = unserialize($serialized); >> >>>> $this->name = $data['name']; >> >>>> $this->address = $data['address']; >> >>>> } >> >>>> //setters and getters for $name and $address >> >>>> } >> >>>> Class object must implement \Serializable, this way when >> >>>> serializing/unserializing the object, this will trigger the look for >> >>>> its two >> >>>> abstract implementation methods: serialize() and unserialize() >> >>>> This way, "serialize" will have access to private members for >> >>>> serialization, and when "unserialize" will look for the object's >> >>>> method >> >>>> "unserialize" and will set unserialized $data to its private members. >> >>>> Both methods are like bridges to the private members. >> >>>> Notice that if Object A has a reference to Object B (like in >> >>>> associations) Object B has to implement \Serializabe as well. >> >>>> And hope this help someone when having this same issue (that has >> >>>> nothing >> >>>> to do with the framework itself, but PHP ) >> >>>> Regards! >> >>>> 2011/5/15 Luis Cordova <cordo...@gmail.com> >> >>>>> >> >>>>> nobody is doubting that Tim >> >>>>> >> >>>>> On Sun, May 15, 2011 at 7:48 PM, Tim Nagel <t...@nagel.com.au> wrote: >> >>>>> > They're talking about: >> >>>>> > http://php.net/manual/en/class.serializable.php >> >>>>> > >> >>>>> > Not the Serializer component in Symfony2. >> >>>>> > >> >>>>> > >> >>>>> > t >> >>>>> > >> >>>>> > >> >>>>> > On Mon, May 16, 2011 at 08:52, oscar balladares >> >>>>> > <liebegr...@gmail.com> wrote: >> >>>>> >> I'm having this problem too. Core Devs suggest to implement >> >>>>> >> Serializable >> >>>>> >> interface. >> >>>>> >> Symfony has Serializer classes and Interfaces, but I still dont >> >>>>> >> know >> >>>>> >> how to >> >>>>> >> implement it/them. >> >>>>> >> If you are lucky, please share what you have found, if any. >> >>>>> >> Regards! >> >>>>> >> >> >>>>> >> 2011/5/11 Luis Cordova <cordo...@gmail.com> >> >>>>> >>> >> >>>>> >>> right but this was not what was happening. >> >>>>> >>> I had a chain of entities, and they all were entities, regular >> >>>>> >>> POPOs. >> >>>>> >>> And I had to implement serialize method for one of them for this >> >>>>> >>> thing >> >>>>> >>> to work. >> >>>>> >>> >> >>>>> >>> On Wed, May 11, 2011 at 2:19 AM, Marco Pivetta >> >>>>> >>> <ocram...@gmail.com> >> >>>>> >>> wrote: >> >>>>> >>> > The ORM uses proxy classes internally. Thus, while working >> >>>>> >>> > with >> >>>>> >>> > the >> >>>>> >>> > proxies >> >>>>> >>> > (when you load stuff from DB you usually receive a proxy from >> >>>>> >>> > the >> >>>>> >>> > Object >> >>>>> >>> > Hydrator), you don't have access to private vars defined in >> >>>>> >>> > your >> >>>>> >>> > entities. >> >>>>> >>> > That's why serialization of a proxy fails (and you should not >> >>>>> >>> > serialize >> >>>>> >>> > proxies! detach them from the entity manager first to get a >> >>>>> >>> > clean >> >>>>> >>> > POPO!) >> >>>>> >>> > >> >>>>> >>> > Marco Pivetta >> >>>>> >>> > @Ocramius >> >>>>> >>> > http://marco-pivetta.com >> >>>>> >>> > >> >>>>> >>> > >> >>>>> >>> > >> >>>>> >>> > On 11 May 2011 01:10, Christophe COEVOET <s...@notk.org> >> >>>>> >>> > wrote: >> >>>>> >>> >> >> >>>>> >>> >> Le 10/05/2011 13:25, AndyPI a écrit : >> >>>>> >>> >>> >> >>>>> >>> >>> Don't know if it helps, but changing my variables from >> >>>>> >>> >>> 'private' to >> >>>>> >>> >>> 'protected' in Symfony2 entities removed this problem for >> >>>>> >>> >>> me. >> >>>>> >>> >>> >> >>>>> >>> >>> The Symfony2 docs use protected in their examples, but the >> >>>>> >>> >>> console >> >>>>> >>> >>> generates variables as private. Something to look at? >> >>>>> >>> >> >> >>>>> >>> >> The Doctrine doc advices to use the \Serializable interface: >> >>>>> >>> >> >> >>>>> >>> >> >> >>>>> >>> >> >> >>>>> >>> >> http://www.doctrine-project.org/docs/orm/2.0/en/reference/architecture.html >> >>>>> >>> >> >> >>>>> >>> >> -- >> >>>>> >>> >> Christophe | Stof >> >>>>> >>> >> >> >>>>> >>> >> -- >> >>>>> >>> >> If you want to report a vulnerability issue on symfony, >> >>>>> >>> >> please >> >>>>> >>> >> send it >> >>>>> >>> >> to >> >>>>> >>> >> security at symfony-project.com >> >>>>> >>> >> >> >>>>> >>> >> You received this message because you are subscribed to the >> >>>>> >>> >> Google >> >>>>> >>> >> Groups "symfony users" group. >> >>>>> >>> >> To post to this group, send email to >> >>>>> >>> >> symfony-users@googlegroups.com >> >>>>> >>> >> To unsubscribe from this group, send email to >> >>>>> >>> >> symfony-users+unsubscr...@googlegroups.com >> >>>>> >>> >> For more options, visit this group at >> >>>>> >>> >> http://groups.google.com/group/symfony-users?hl=en >> >>>>> >>> > >> >>>>> >>> > -- >> >>>>> >>> > If you want to report a vulnerability issue on symfony, please >> >>>>> >>> > send it >> >>>>> >>> > to >> >>>>> >>> > security at symfony-project.com >> >>>>> >>> > >> >>>>> >>> > You received this message because you are subscribed to the >> >>>>> >>> > Google >> >>>>> >>> > Groups "symfony users" group. >> >>>>> >>> > To post to this group, send email to >> >>>>> >>> > symfony-users@googlegroups.com >> >>>>> >>> > To unsubscribe from this group, send email to >> >>>>> >>> > symfony-users+unsubscr...@googlegroups.com >> >>>>> >>> > For more options, visit this group at >> >>>>> >>> > http://groups.google.com/group/symfony-users?hl=en >> >>>>> >>> > >> >>>>> >>> >> >>>>> >>> -- >> >>>>> >>> If you want to report a vulnerability issue on symfony, please >> >>>>> >>> send >> >>>>> >>> it to >> >>>>> >>> security at symfony-project.com >> >>>>> >>> >> >>>>> >>> You received this message because you are subscribed to the >> >>>>> >>> Google >> >>>>> >>> Groups "symfony users" group. >> >>>>> >>> To post to this group, send email to >> >>>>> >>> symfony-users@googlegroups.com >> >>>>> >>> To unsubscribe from this group, send email to >> >>>>> >>> symfony-users+unsubscr...@googlegroups.com >> >>>>> >>> For more options, visit this group at >> >>>>> >>> http://groups.google.com/group/symfony-users?hl=en >> >>>>> >> >> >>>>> >> -- >> >>>>> >> If you want to report a vulnerability issue on symfony, please >> >>>>> >> send >> >>>>> >> it to >> >>>>> >> security at symfony-project.com >> >>>>> >> >> >>>>> >> You received this message because you are subscribed to the >> >>>>> >> Google >> >>>>> >> Groups "symfony users" group. >> >>>>> >> To post to this group, send email to >> >>>>> >> symfony-users@googlegroups.com >> >>>>> >> To unsubscribe from this group, send email to >> >>>>> >> symfony-users+unsubscr...@googlegroups.com >> >>>>> >> For more options, visit this group at >> >>>>> >> http://groups.google.com/group/symfony-users?hl=en >> >>>>> >> >> >>>>> > >> >>>>> > -- >> >>>>> > If you want to report a vulnerability issue on symfony, please >> >>>>> > send >> >>>>> > it to security at symfony-project.com >> >>>>> > >> >>>>> > You received this message because you are subscribed to the Google >> >>>>> > Groups "symfony users" group. >> >>>>> > To post to this group, send email to >> >>>>> > symfony-users@googlegroups.com >> >>>>> > To unsubscribe from this group, send email to >> >>>>> > symfony-users+unsubscr...@googlegroups.com >> >>>>> > For more options, visit this group at >> >>>>> > http://groups.google.com/group/symfony-users?hl=en >> >>>>> > >> >>>>> >> >>>>> -- >> >>>>> If you want to report a vulnerability issue on symfony, please send >> >>>>> it >> >>>>> to security at symfony-project.com >> >>>>> >> >>>>> You received this message because you are subscribed to the Google >> >>>>> Groups "symfony users" group. >> >>>>> To post to this group, send email to symfony-users@googlegroups.com >> >>>>> To unsubscribe from this group, send email to >> >>>>> symfony-users+unsubscr...@googlegroups.com >> >>>>> For more options, visit this group at >> >>>>> http://groups.google.com/group/symfony-users?hl=en >> >>>> >> >>> >> >>> -- >> >>> If you want to report a vulnerability issue on symfony, please send it >> >>> to >> >>> security at symfony-project.com >> >>> >> >>> You received this message because you are subscribed to the Google >> >>> Groups "symfony users" group. >> >>> To post to this group, send email to symfony-users@googlegroups.com >> >>> To unsubscribe from this group, send email to >> >>> symfony-users+unsubscr...@googlegroups.com >> >>> For more options, visit this group at >> >>> http://groups.google.com/group/symfony-users?hl=en >> >> >> >> -- >> >> If you want to report a vulnerability issue on symfony, please send it >> >> to >> >> security at symfony-project.com >> >> >> >> You received this message because you are subscribed to the Google >> >> Groups "symfony users" group. >> >> To post to this group, send email to symfony-users@googlegroups.com >> >> To unsubscribe from this group, send email to >> >> symfony-users+unsubscr...@googlegroups.com >> >> For more options, visit this group at >> >> http://groups.google.com/group/symfony-users?hl=en >> > >> > -- >> > If you want to report a vulnerability issue on symfony, please send it >> > to >> > security at symfony-project.com >> > >> > You received this message because you are subscribed to the Google >> > Groups "symfony users" group. >> > To post to this group, send email to symfony-users@googlegroups.com >> > To unsubscribe from this group, send email to >> > symfony-users+unsubscr...@googlegroups.com >> > For more options, visit this group at >> > http://groups.google.com/group/symfony-users?hl=en >> > >> >> -- >> If you want to report a vulnerability issue on symfony, please send it to >> security at symfony-project.com >> >> You received this message because you are subscribed to the Google >> Groups "symfony users" group. >> To post to this group, send email to symfony-users@googlegroups.com >> To unsubscribe from this group, send email to >> symfony-users+unsubscr...@googlegroups.com >> For more options, visit this group at >> http://groups.google.com/group/symfony-users?hl=en > > -- > If you want to report a vulnerability issue on symfony, please send it to > security at symfony-project.com > > You received this message because you are subscribed to the Google > Groups "symfony users" group. > To post to this group, send email to symfony-users@googlegroups.com > To unsubscribe from this group, send email to > symfony-users+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/symfony-users?hl=en > -- If you want to report a vulnerability issue on symfony, please send it to security at symfony-project.com You received this message because you are subscribed to the Google Groups "symfony users" group. To post to this group, send email to symfony-users@googlegroups.com To unsubscribe from this group, send email to symfony-users+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/symfony-users?hl=en