PhpStorm langsam durch falsche JVM

Leider wurde meine geliebte IDE PhpStorm auf meinem Mac immer langsamer. Syntaxvorschläge brauchten viel zu lange zum laden und ein flüssiges Arbeiten war nicht mehr möglich. Ein Blick unter PhpStorm-> Über PhpStorm verriet schnell, dass eine alte 1.6er JVM das Programm ausführt. Als großer „Liebhaber“ sämtlicher Java Probleme war mir gleich klar, dass es an der veralteten JVM liegen kann. Gut, dass JetBrains eine Anleitung zum Ändern der JVM bereitstellt:
https://intellij-support.jetbrains.com/entries/23455956-Selecting-the-JDK-version-the-IDE-will-run-under

Long story short:

vim /Applications/PhpStorm.app/Contents/Info.plist

Nach JVMVersion suchen. Steht dort 1.6* sollte man – natürlich nur wenn Java 7 installiert ist – auf 1.7* ändern.

<key>JVMVersion</key>
<string>1.7*</string>

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!