Bonjour, je suis entrain de développer une application à l'aide du Framework Symfony2. En ce moment j'aimerais journaliser les les manipulations des différentes tables afin de les persister et en avoir un historique.

Pour ce faire, j'ai d'abord configuré mon fichier config.yml en ajoutant un service et un listener basé sur un événement onFlush comme suit :

...
services:
LoggingListener:
class: compagnie\CRUDBundle\Listener\LoggingListener
tags:
- { name: doctrine.event_listener, event: onFlush, method: onFlush }

Ensuite, j'ai créé une classe LoggingListener dans le répertoire compagnie\CRUDBundle\Listener comme ci-dessous.
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
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
namespace compagnie\CRUDBundle\Listener;
 
use Doctrine\ORM\Event\OnFlushEventArgs;
use compagnie\CRUDBundle\Entity\SysLog;
 
class LoggingListener {
 
/**
* @param \Doctrine\ORM\Event\OnFlushEventArgs $ea
*/
public function onFlush(OnFlushEventArgs $eventArgs) {
$em = $eventArgs->getEntityManager();
 
$eventManager = $em->getEventManager();
 
// Remove event, if we call $this->em->flush() now there is no infinite recursion loop!
$eventManager->removeEventListener('onFlush', $this);
 
$uow = $em->getUnitOfWork();
 
foreach ($uow->getScheduledEntityInsertions() AS $entity) {
$this->createLog($em, 'INSERT', $entity);
echo "INSERT";
}
 
foreach ($uow->getScheduledEntityUpdates() AS $entity) {
$this->createLog($em, 'UPDATE', $entity);
echo "UPDATE";
}
 
foreach ($uow->getScheduledEntityDeletions() AS $entity) {
$this->createLog($em, 'DELETE', $entity);
echo "DELETE";
}
 
//Re-attach since we're done
$eventManager->addEventListener('onFlush', $entity);
}
 
private function createLog($em, $action, $entity) {
 
$syslog = new SysLog;
 
$syslog->setInstant(new \DateTime);
$syslog->setAction($action);
$syslog->setTablename($em->getClassMetadata(get_class($entity))->getTableName());
$syslog->setEntity(get_class($entity));
 
$syslog->setController('');
$syslog->setData('');
$syslog->setSysUserId('');
 
$em->persist($syslog);
$em->flush();
}
}
Bien entendu, l'Entity SysLog existe et possède ses attributs ainsi que ses méthodes Setters et Getters. Mes questions concerne l'affectation des valeurs dans la méthode createLog($em, $action, $entity) pour les éléments ci-dessous :

  • $syslog->setController('');
    Comment puis-je récupérer le nom du contrôleur en question d'où provient l'action?
  • $syslog->setData('');
    Comment puis-je récupérer tous les attributs de l'entité avec ses valeurs en les regroupant par exemple avec un delimiter?
    Exemple : attr1:val1;attr2:val2;attr3:val3;...
    Un attribut peut également être une ArrayCollection...
  • $syslog->setSysUserId('');
    Et la dernière question, surtout, comment je peux récupérer l'identifient (ID) de l'utilisateur connecté?


Merci d'avance de votre aide