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

Reply via email to