Bonjour à tous,

Je souhaite persister un objet possédant une collection.
Dans une méthode qui s'occupe de gérer l'enregistrement du formulaire, j'ouvre donc une transaction dans laquelle j'enchaine persist(), flush() et commit(). Le persist cascade se fait alors correctement puisque les méthodes PrePersist se trouvant sur les objets de la collection sont bien appelés.

Le souci c'est qu'en cas d'erreur après le persist, je catch une exception, j'exécute un rollback (au cas ou certains enregistrements seraient passés quand même) mais ce que je souhaite c'est retrouver ma collection dans l'état dans lequel elle se trouvait juste après l'avoir bind. Toute les modifications dues au persist() et aux méthodes prePersist() je ne veux pas les retrouver.
Mes nouveaux items qui se sont rajoutés à la collection possèdent un id par exemple : même s'ils n'ont pas été flush ou commit, ils ont été persistés et un id leur a été assigné, la date de création ou de modification également lors du prePersist : toutes ces infos je veux qu'elles disparaissent, mais je veux que les objets restent puisque je désire les réafficher dans le formulaire : comme s'il y avait eu une erreur de validation de form.

Voilà à quoi ressemble ma méthode actuellement :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
public function processEntityForm(Entity $objEntity)
    {
        // Mon objet $objEntity n'a encore subi aucune modification
        // Si ça tourne mal, je veux le réafficher dans mon form dans cet état là
 
        foreach ($objEntity->getItems() as $objItem) {
            // Ici plein de modifications sur mes items
        }
 
        // Enregistrement des modifications
        try {
            $this->objEm->beginTransaction();
            $this->objEm->persist($objEntity);
            $this->objEm->flush(); // Une exception est levée à cet endroit
            $this->objEm->commit();
        } catch (\Exception $ex) {
            $this->objEm->rollback();
            // Que dois-je faire ici pour récupérer mon objet Entity tel qu'il était au départ
            throw $ex;
        }
    }
J'avais pensé à cloner mon $objEntity au départ et le remplacer dans mon EntityManager en cas d'exception mais ça me parrait quelque peu bourrin. Je suis intimement persuadé que quelque chose de plus simple m'échappe.

Merci d'avance.