Until the BETA2 update I was getting warnings related to serializing
the User Entity, it is a breaking problem in beta2.  So, I googled
around and found this:

http://groups.google.com/group/symfony-users/browse_thread/thread/54c...

Following the advice there, I created serialize() and unserialize()
methods and had my "Users" class implement \Serializable.  I tried
returning an array, which through the following Exception:

"Symfony\Component\Security\Core\Authentication\Token
\UsernamePasswordToken::serialize() must return a string or NULL"

I returned null and it worked but it rendered the Entity returned by
$this->get('security.context') and it's twig counterpart useless
because it contained no data.

So, I tried imploding the array and returning that and was met with
the Exception noted above.

I also tried looking through the "Security" chapter in the book and
could not find any  information about how to or what to serialize.
Can anyone point me to a resource that explains how to do this in a
Symfony-appropriate way?

Roger

On May 17, 1:58 am, Marco Pivetta <ocram...@gmail.com> wrote:
> I usually build stuff like this when making a multi-step form with different
> http requests:
>
> request 1:
> $ns = new \Zend_Session_Namespace('test'); //don't care about it, I usually
> work with ZF
> /* We suppose this is my entity fetched by some kind of voodoo query or
> complex stuff that can be done only in step 1 (picker?) */
> $modifiedUser = $em->getRepository('My\User')->findOneBy(array('fullname' =>
> 'Marco Pivetta'));
> $em->detach($modifiedUser);
> $ns->user = $modifiedUser;
>
> request 2:
> $ns = new \Zend_Session_Namespace('test');
> //Bringing my user entity back to life!
> $modifiedUser = $ns->user;
> $em->merge($modifiedUser);
> $em->refresh($modifiedUser); //Yeah, this is overhead, but it solved a LOT
> of troubles in my case...
> $modifiedUser->doStuff();
> //Now again, for the next step! And so on and on and on...
> $em->detach($modifiedUser);
> $ns->user = $modifiedUser;
>
> request 3:
> //repeat stuff like request 2 here!
>
> Marco Pivetta
> @Ocramius <http://twitter.com/Ocramius>http://marco-pivetta.com
>
> On 17 May 2011 04:53, Luis Cordova <cordo...@gmail.com> wrote:
>
>
>
>
>
>
>
> > 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
>
> ...
>
> read more »

-- 
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