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

Reply via email to