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