voglio salvare uno dei miei un'entità oggetti nella sessione, ma come sto facendo così, sto ottenendo i seguenti due errori:Symfony2 entità serializzare oggetto alla sessione
Eccezione: Symfony \ Bundle \ FrameworkBundle \ DataCollector \ RequestDataCollector :: Serialize() deve restituire una stringa o NULL
e
ErrorException: Avviso: di serie ize(): "id" restituito come membro variabile da __sleep() ma non esiste in /var/www/clients/client71/web256/web/_dev_fd/kkupon/vendor/symfony/src/Symfony/Component/HttpKernel /DataCollector/DataCollector.php linea 29
il mio codice va in questo modo:
$offer = $this->getEntityManager()->getRepository('KkuponMainBundle:Offer')->find($offer_id);
$request->getSession()->set('offer', $offer);
Come potrei farlo bene?
Grazie.
UPDATE Con l'aiuto di Rowgm ho potuto risolvere questo problema impostando le proprietà protette invece che private. L'unico problema che ho è dopo che legge l'entità dalla sessione che EntityManager non conosce a tale proposito e se aggiungo l'oggetto (dalla sessione) a un altro oggetto (esiste una relazione OneToMany tra di loro), non lo farà lavoro.
<?php
$offer = $this->get('session')->get('offer');
$coupon = new Coupon();
$coupon->setOffer($offer);
$this->em->persist($coupon);
$this->em->flush();
Questo genera un errore, perché coupon ha una proprietà oggetto che secondo l'EntityManager non è nel database (in realtà è nel DB, ho messo alla sessione dal DB).
<?php
$offer = $this->get('session')->get('offer');
echo $this->em->getUnitOfWork()->isInIdentityMap($offer) ? "yes":"no"; //result: no
Una soluzione può essere: $offer = $this->em->merge($offer);
Ma questo doesnt sembrano essere il migliore. Mi piacerebbe che il mio EntityManager percepisca gli oggetti entità memorizzati nella sessione senza dirlo ogni volta. Qualche idea?
Grazie, ha aiutato molto. –
Per favore, se puoi, rispondi alla parte di aggiornamento della mia domanda. –
Pensaci: se si memorizza tutta quell'entità, si memorizzerà un oggetto Big nei dati della sessione. Per il tuo ambiente di sviluppo, non è un problema. Ma se hai molti utenti, è uno spreco di risorse. La soluzione è così semplice: memorizza l'id dell'oggetto e usa il metodo find() del repository per recuperare l'oggetto. Alla fine, è la stessa cosa. –