Doctrine automatiser une insertion

Rechercher

Doctrine automatiser une insertion

Par saturn1  -  4 reponses  -  Le 27/03/2009 21:41  -  Editer  - 

Bonjour toujours dans la logique de "write less do more" je réfléchissai à quelque chose .

Sur un site je veux faire un système antiflood commun à toutes les tables. C'est à dire que dès qu'un membre effectue une tâche sur mon site de type (poster un commentaire, ouvrir un nouveau sujet sur le forum, faire une réponse ...) je veux enregistrer dans une table flood son id et la date (NOW())

 

Maintenant je veux savoir si sans écrire à chaque fois $flood = newFlood($idMembre); à chaque $objet->save() si il est possible que dès que dans la base de donnée on enregistre une entrée avec une colonne "user_id" on enregistre une nouvelle entrée dans la table flood.

 

Je sais pas si c'est clair?

Merci :)

 

Réponses apportées à cette discussion

Par Emacs  -  Le 27/03/2009 23:11  -  Haut de page  - 

Il te suffit simplement de surcharger la méthode save() de ton objet en prenant garde à utiliser une transaction, comme ci-dessous :

<?php class Article extends Doctrine_Record{  public function save(Doctrine_Connection $conn = null)  {    if (is_null($conn))    {      $conn = $this->_table->getConnection();    }     $ret = false;     try    {      $conn->beginTransaction();       $ret = parent::save($conn);       $flood = new myFlood();      $flood->setModelId($this->getId());      $flood->setUser($this->getUser());      $flood->setMessage('Article enregistré');      $flood->save($conn);       $conn->commit();       return $ret;    }    catch (Exception $e)    {      $conn->rollback();       throw $e;    }  }}

++

 
Par saturn1  -  Le 27/03/2009 23:31  -  Haut de page  - 

Oé sa à l'air cool et bien pensé ...

Maintenant est-il possible de surcharger la méthode save() de doctrine_Record ou c'est mieux de surcharger module par module??!?

 

Merci =)

 
Par Emacs  -  Le 27/03/2009 23:49  -  Haut de page  - 

Il vaut mieux ne pas toucher à Doctrine_Record dans la mesure où c'est une classe "du noyau" qui est versionnée, et qui donc peut changer à tout moment et écraser tes modifications.

Il y a deux solutions potentielles pour pouvoir mutualiser la création de ton objet Flood quel que soit l'objet de modèle sauvegardé en base de données.

La première méthode consiste à créer une classe intermédiaire entre tes objets de modèle et Doctrine_Record. Tes modèles hériteraient de cette classe qui elle même hériterait de Doctrine_Record. Le problème que ça pose c'est que les classes de modèle dérivent toutes d'une classe de base abstraite qui contient la définition du modèle, qui elles mêmes dérivent de sfDoctrineRecord, qui elle même hérite de Doctrine_Record en réalité. Bref, pas facile à gérer car tu seras obligés de casser le modèle... Donc finalement cette méthode est à proscrire.

La seconde solution et la meilleure consiste à écrire son propre behavior Doctrine comme il en existe déjà comme Sluggable, NestedSet, Timestampable... Il te suffit d'écrire ton behavior Floodable que tu attaches dans ton schema.yml à toutes tes classes de modèle. Un behavior n'est en fait qu'une classe qui herite de Doctrine_Template et qui implémente la logique du behavior à appliquer à l'objet Doctrine. C'est en fin de compte une manière détournée de faire de l'héritage multiple en PHP. Tu peux jeter un oeil à la doc de doctrine pour voir comment écrire des behaviors pour les classes de modèle.

++

 
Par saturn1  -  Le 28/03/2009 10:32  -  Haut de page  - 

la technique du behavior doctrine me semble très professionnel et pratique.

je vais me renseigner merci à toi!

 

Ajouter une réponse à la discussion

Seuls les membres connectés sont autorisés à poster dans les forums !

Identifiez-vous
Join |  ID/MDP? |