Ajouter une action avant sauvegarde entity : prePost
Si vous avez déjà utilisé de nombreux frameworks, vous vous doutez que Symfony2 via Doctrine fournit sûrement un moyen de réaliser des actions sur événements : avant une sauvegarde, avant une mise à jour, après sauvegarde, etc….
Exemple : vous avez un prix mini et un prix maxi. Dans la logique l’internaute ne devrait pas les saisir dans le mauvais ordre mais ne sait-on jamais…
Deux solutions :
- Vous ajoutez une contrainte sur le formulaire afin qu’il affiche une erreur,
- Vous faites vous même le transfert de données du prix mini <-> prix maxi pour ne pas embêter l’internaute.
Pour ce deuxième cas, vous aurez recours aux LifecycleCallbacks ( plus d’informations sur le site Doctrine ). Voici comment faire :
1- Ajouter @HasLifecycleCallbacks ou @ORM\HasLifecycleCallbacks si vous êtes en ORM à la définition de votre classe.
/** * Namespace\XXXXXBundle\Entity\MonEntite * @ORM\HasLifecycleCallbacks * @ORM\Table() * @ORM\Entity() */ class MonEntite {
2 – Définir une fonction qui inverse vos champs avec l’annotation événementiel, par exemple @PrePersist ou @ORM\PrePersist
/** @ORM\PrePersist */ public function changePrixMaxiPourPrixMini() { //Mon code ici }
Et voilà le tour est joué !
Attention aux événements, ils sont trompeurs. Une entité qu’on met à jour n’utilise pas Persit mais Update. Vous aurez donc :
/** @ORM\PreUpdate */ public function changePrixMaxiPourPrixMinionUpdate() { $this->changePrixMaxiPourPrixMini(); }
Vous trouverez d’autres méthodes sur la documentation officielle Symfony2 : http://symfony.com/fr/doc/current/cookbook/doctrine/event_listeners_subscribers.html