Quiero salvar a uno de mi entidad de objetos en la sesión, pero como yo estoy haciendo así, yo estoy poniendo los dos errores siguientes:Symfony2 entidad serializar objetos a la sesión
Excepción: Symfony \ Bundle \ FrameworkBundle \ Recopilador de Datos \ RequestDataCollector :: serialize() debe devolver una cadena o NULL
y
ErrorException: Aviso: serial ize(): "id" devuelto como miembro variable de __sleep() pero no existe en /var/www/clients/client71/web256/web/_dev_fd/kkupon/vendor/symfony/src/Symfony/Component/HttpKernel /DataCollector/DataCollector.php línea 29
Mi código es el siguiente:
$offer = $this->getEntityManager()->getRepository('KkuponMainBundle:Offer')->find($offer_id);
$request->getSession()->set('offer', $offer);
¿Cómo podría hacerlo bien?
Gracias.
ACTUALIZACIÓN Con la ayuda de Rowgm, pude solucionar este problema estableciendo propiedades protegidas en lugar de privadas. El único problema que tengo es después de leyendo la entidad de la sesión que el EntityManager no conoce, y si agrego el objeto (desde la sesión) a otro objeto (hay una relación OneToMany entre ellos), no lo hará trabajo.
<?php
$offer = $this->get('session')->get('offer');
$coupon = new Coupon();
$coupon->setOffer($offer);
$this->em->persist($coupon);
$this->em->flush();
Esto generará un error, porque cupón tiene una propiedad de objeto que según el EntityManager no está en la base de datos (en realidad es en el PP, puse a la sesión de la BD).
<?php
$offer = $this->get('session')->get('offer');
echo $this->em->getUnitOfWork()->isInIdentityMap($offer) ? "yes":"no"; //result: no
Una solución puede ser: $offer = $this->em->merge($offer);
Pero ésto no parece ser la mejor. Me gustaría que mi EntityManager perciba los objetos de entidad almacenados en sesión sin decirlo cada vez. ¿Alguna idea?
Gracias, ayudó mucho. –
Por favor, si puede, responda la parte de actualización de mi pregunta. –
Piénselo: si almacena toda esa entidad, almacenará un objeto grande en sus datos de sesión. Para su entorno de desarrollo, no es un problema. Pero si tienes muchos usuarios, es un desperdicio de recursos. La solución es tan simple: almacenar la identificación del objeto y usar el método find() del repositorio para recuperar el objeto. Al final, es lo mismo. –