2016-03-28 4 views
0

eingebunden wird Ich habe eine Doktrin EntityListener eingerichtet. Ich muss einen Code im postRemove Ereignis ausführen, das aus keiner Doktrin-Transaktion herauskommen muss. Allerdings:Verhindern, dass Doctrine EntityListener postRemove in die Transaktion

public function postRemove(Image $image, LifecycleEventArgs $event) 
{ 
    $isActive = $event->getEntityManager()->getConnection()->isTransactionActive(); 
    dump($isActive); 
} 

immer Dumps wahr.

Egal ob ich commit oder flush innerhalb der postRemove() Methode; Ich habe versucht, die Transaktion in preRemove() zu starten und in postRemove() zu committen, aber das hilft nicht.

Frage: Gibt es eine Möglichkeit, zu verhindern, dass Doctrine postRemove() in die Transaktion einpackt? Wenn nein, was ist der beste Weg für mich, einen Code auszuführen, der keine Transaktionen enthält? Es ist mir egal, ob es sofort passiert oder auf Kernel terminiert, solange es schließlich passiert.

Ich habe eine Idee, eine Destruktor-Methode in der EntityListener zu erstellen, und führen Sie den Code, wenn Listener zerstört, aber ich weiß nicht, wie zuverlässig das wäre. Vielleicht gibt es andere (bessere) Möglichkeiten?

danke!

Antwort

1

Klingt so, als ob Sie spülen oder persistieren möchten, was Sie in einem postRemove-Ereignis nicht tun möchten.

Aus der Dokumentation:

Änderungen sind hier nicht relevant für die Persistenz in der Datenbank, aber Sie diese Ereignisse können nicht-persistente Objekte zu ändern, wie nicht zugeordneten Felder, Protokollierung oder sogar verknüpfte Klassen, die nicht direkt von Doctrine zugeordnet werden, sind .

Dieses Ereignis ist also nicht zum Ausführen von Operationen mit dem EntityManager vorgesehen.

Verwenden Sie stattdessen eine onFlush listener. Sie können Instanzen Ihrer entfernten Entität abfangen und entsprechende Aktionen ausführen. Lesen Sie die Dokumentation sorgfältig, vor allem die Die folgenden Einschränkungen gelten für den onFlush Ereignis Abschnitt

http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/events.html#onflush

+0

Die docs sagen, dass EntityManager :: Flush() innerhalb onFlush Ereignis Aufruf ist auch eine schlechte Idee. Mein Problem ist: Wenn ich ein neues Bild persistiere, möchte ich mehrere Formate dieses Bildes erstellen, diese Formate im Dateisystem speichern und Referenzen (Zeilen) auf diese Dateien in einer anderen Tabelle haben. Um keine Inkonsistenzen zwischen Dateisystem und Datenbank zu haben, muss ich nach jeder fs-Schreiboperation löschen. Aber es stellt sich heraus, dass ich weder in pre/postPersist, noch in onFlush spülen kann? – Karolis

+0

Vielleicht ist es eine schlechte Idee, all diese Arbeit im EntityListener zu erledigen? – Karolis

+0

Sie müssen nicht flush aufrufen, Sie verwenden die unitofwork, um Änderungen vorzunehmen und persistieren Sie, dann erneut berechnen, set, done. Hier ist ein Beispiel aus einer anderen Frage, die ich beantwortet habe: http://stackoverflow.com/questions/30734814/persisting-other-entities-inside-preupdate-of-doctrine-entity-listener/30741471#30741471 - das funktioniert, ich benutze es in Live-Produktionssysteme. – Richard

Verwandte Themen