Doctrine 2 – Objekte aus der Session

Heute wollte ich in einem Zend 2 Projekt mein geliebtes „User“-Objekt wieder aus der Session holen, damit ich es in einem anderen von Doctrine verwalteten Entity ordentlich referenzieren kann und natürlich vorher die Nutzerrechte prüfen kann.

Da mein Login den Zend\Authentication\AuthenticationService verwendet, kommt man an die Identität und damit in meinem Fall an das User Objekt leicht ran.

$user = $this->getAuthService()->getIdentity()

Nun wollte ich das ganze meinem neuen Ziel-Objekt mitgeben und dann per $orm->persist abspeichern. Nennen wir es einfach kurz $buch.

$buch->setUser($user); 
$orm->persist($buch);
$orm->flush();

 

Leider resultierte das in einer dicken Fehlermeldung seitens Doctrine:

Doctrine\ORM\ORMInvalidArgumentException: A new entity was found through the relationship 

Was war passiert? Doctrine konnte mit dem Objekt nichts mehr anfangen, nach dem es aus der Session geladen wurde, denn der EntityManager weiß bei einem erneuten Seitenaufruf nichts mehr von diesem Objekt.

Zum Glück half die Doctrinehilfe schnell: http://doctrine-orm.readthedocs.org/en/latest/cookbook/entities-in-session.html

Die Lösung in Kurzform: Man muss das Objekt mit der merge() Funktion des EntityManagers neuladen, damit man es benutzen kann. Entgültiger Code ist dann also:

$user = $this->getAuthService()->getIdentity();
//Die obere Zeile kann man natürlich direkt in die Funktion einsetzen! 
$user = $orm->merge($user);
$buch->setUser($user); 
$orm->persist($buch);
$orm->flush();

Am Ende hat man wieder etwas gelernt!

Any thoughts?