2017-02-08 2 views
0

Wenn ein EntityManager eine flush macht und diese Flush eine Ausnahme auslöst. Der Doktrin-Entitätsmanager fängt diese Ausnahme ab und löscht die Arbeitseinheit und mark the connection als geschlossen und führt dann den Rollback durch (https://github.com/doctrine/doctrine2/blob/v2.5.6/lib/Doctrine/ORM/UnitOfWork.php#L412-L417).Wiederherstellen Doctrine Verbindung nach fehlgeschlagenen Flush

Ich brauche die Verbindung wiederherzustellen, aber da es keine Methode mit ist tut $this->closed = false in der EntityManager Ich bin verwirrt, wie dies, dass zu behandeln, nachdem ein flush fehlgeschlagen ich ein anderes Unternehmen flush kann dies markieren einen bestimmten in der Datenbank zu markieren Aufgabe als fehlgeschlagen! Ich kann auch nicht mehrere Aufgaben ausführen, wenn eine vorherige fehlgeschlagen ist und die andere nicht ausgeführt werden kann, wenn der EntityManager verwendet wird.

TL; DR Was ist die beste Vorgehensweise, um die Verbindung nach einem fehlgeschlagenen Flush wiederherzustellen? Wie ich sehe, ist es nur als geschlossen markiert und immer noch verbunden, aber ich möchte nicht etwas Schmutziges wie Reflection oder einen benutzerdefinierten Entity Manager verwenden, um meine Verbindung wiederherzustellen.

Antwort

3

können Sie die Funktion nutzen resetManager Like This $this->getDoctrine()->resetManager()
ausführlicher in diesem link

bearbeiten

können sagen Exemple seinen Tisch ein Datumsfeld als Datum- hat und nicht null

$Exemple = new Exemple(); 
    $Exemple->setDate(null); 
    $em = $this->getDoctrine()->getManager(); 
    try { 
     $em->persist($Exemple); 
     $em->flush(); 
    } catch (\Exception $ex) { 
     $em = $this->getDoctrine()->resetManager(); 
    } 
    $Exemple->setDate(new \DateTime()); 
    $em->persist($Exemple); 
    $em->flush(); 

mit $this->getDoctrine()->resetManager(); die Daten es in Datenbank
ohne $this->getDoctrine()->resetManager(); gespült bekommen wir Der EntityManager ist geschlossen.

+0

Sie können das sicherlich tun. Wird nicht ein bisschen helfen. Sobald eine Ausnahme ausgelöst wird, kann der Entitätsmanager nicht weiter verwendet werden. Down abgestimmt entsprechend. – Cerad

+0

hi @Cerad Kannst du eine Dokumentation zur Verfügung stellen, die beweist, dass wir getManager nach Exception Throw nicht verwenden können, da ich resetManager in meinem Code und seiner Arbeit verwende, bearbeite ich meine Antwort auf ein kleines Beispiel –

+0

Es ist ein bisschen schwer zu analysieren die ursprüngliche Frage, aber ich bin mir ziemlich sicher, dass er keinen neuen Entity Manager will. Mal sehen, ob er antwortet. – Cerad

1

Versuchen Sie dies, zuerst fangen Sie in Ihrer Methode, wenn es eine Ausnahme wirft, danach können Sie überprüfen, ob die Verbindung noch offen ist, andernfalls neu definieren.

$result = $this->functionABC();// catch if it throws an exception 

$oEntityManager = $this->getContainer()->get('doctrine')->getManager(); 
$bEntityManagerIsOpen = $oEntityManager->isOpen(); 
if (!$bEntityManagerIsOpen) { 
    $this->getContainer()->get('doctrine')->resetManager(); 
    $oEntityManager = $this->getContainer()->get('doctrine')->getManager(); 
} 

Ich habe diesen Weg in einem Befehl mit Symfony2.8 verwendet und es funktioniert richtig für mich.

+0

Vielen Dank für Ihre Antwort. Werde das versuchen, aber ich bin mir nicht sicher, ob das funktioniert, wenn der Manager in einem anderen Dienst verwendet wird, und ich denke nicht, dass der Dienst den neuen Manager bekommt? –

Verwandte Themen