Je me débats avec ce qui suit, dans une classe d'entité, j'ai un préaviseur de vie de vie qui doit persister une nouvelle entité avant qu'il ne puisse chasser les changements d'une audittrail.
dans PREREMOVE et PRÉSERSIST Ceci fonctionne parfaitement mais en préavisant rien de Marre. Si j'appelle flush moi-même, il va dans une boucle récursive. P>
Selon les groupes Google pour l'utilisateur de la doctrine, le mettre dans Onflush devrait être une option mais dans cet événement, je ne peux pas accéder aux anciennes valeurs de la entité pour enregistrer cette vieille valeurs dans une nouvelle autre entité pour l'audittrail. P>
Un petit exemple Ce que j'essaie d'archiver: p>
$em->getUnitOfWork()->computeChangeSet($em->getClassMetaData(get_class($entity)), $entity);
3 Réponses :
Vous ne devez jamais utiliser l'entitémanager dans vos entités. Si vous souhaitez ajouter des sentiers d'audit, car car vous devriez cartographier l'entité "Oneentéy" à l'entité "Audittrail" et faire quelque chose comme si vous définissez l'option Cascade sur la cartographie, elle sera Soyez persisté lorsque vous persistez "ONENTIENITY". P> P>
Pourquoi ne devriez-vous pas utiliser le gestionnaire d'entité dans mes entités? Et si vous mappiez l'auditité à l'anentitude de l'anentitude, il sera associé à la base de données et ce n'est pas ce que je veux copier mes entités et ajouter d'autres champs tels que «Action» = Mise à jour, etc. Cette auditité n'était qu'un exemple car pour l'audit que j'utilise : Je voudrais utiliser l'événementManager. Je voulais jeter un coup d'œil à votre code mais pas encore de temps.
Je suis enfin utilisé (il y a un an!) Utilisa le gestionnaire d'événements (EventsBscriber) pour effectuer ces tâches à l'échelle mondiale. J'ai inclus cela dans mon cadre: Github.com/php-pike/pike (regarde La partie Entityaudit) Merci!
Voir aussi Stackoverflow.com/Questtions/16904462/...
EntityManager-> persist () ne fonctionnera pas à l'intérieur de la méthode pré-deveudée. Au lieu de cela, vous pouvez enregistrer les données d'audittrail à la session et après la rinçage de l'aiguille de l'anomalie, prenez les données de la session et effectuez EntityManager-> persist (...) et entitémanager-> Flush () P>
J'avais le même problème dans la méthode préempdée d'un événement événementiel. Je résolvai cela en stockant la nouvelle entité dans une propriété et en déplaçant les appels de nouvelles persist () et de flush () à la méthode postupdate.
class someEntity { ... annotations ... protected $store; /** * @PreUpdate */ public function addAuditTrail() { //$em = \Zend_Registry::get('doctrine')->getEntityManager(); $entity = new AuditTrail(); $entity->action = 'update'; $entity->someField = $this->someField; // replaces $em->persist($entity); $this->store = $entity; } /** * @PostUpdate */ public function saveAuditTrail() { $em = \Zend_Registry::get('doctrine')->getEntityManager(); $em->persist($this->store); $em->flush(); }
Je sais qu'il semble légèrement "pirater comme" mais je ne peux pas voir une solution "officielle" à ce cas d'utilisation, j'ai aussi utilisé cette méthode
Malheureusement, appeler flush () code> à l'intérieur d'un rappel de cycle de vie n'est pas pris en charge par la doctrine et cela ne semble pas fonctionner dans des versions de doctrine plus récentes; Je reçois cette erreur: Doctrine-Project.org/jira/browse/dddc-3218 .
Voir ce lien pour comment le faire correctement: Stackoverflow.com/Questtions/16904462/... . Je souhaite qu'il y ait un moyen de le faire à l'intérieur de la classe d'entité, plutôt que de devoir créer une classe mondiale séparée ...