diff --git a/src/UnicaenApp/ORM/Event/Listeners/HistoriqueListener.php b/src/UnicaenApp/ORM/Event/Listeners/HistoriqueListener.php index ef1fd09b0824c779b30a0ad6c7f7104994665a71..daad7972dfef8f8adf1dacd1a78daf4c34e1e7f4 100644 --- a/src/UnicaenApp/ORM/Event/Listeners/HistoriqueListener.php +++ b/src/UnicaenApp/ORM/Event/Listeners/HistoriqueListener.php @@ -1,21 +1,22 @@ <?php + namespace UnicaenApp\ORM\Event\Listeners; -use RuntimeException; -use UnicaenAuth\Entity\Db\AbstractUser; -use Zend\ServiceManager\ServiceLocatorAwareInterface; -use Zend\ServiceManager\ServiceLocatorAwareTrait; +use Doctrine\Common\EventSubscriber; use Doctrine\ORM\Event\LifecycleEventArgs; use Doctrine\ORM\Event\PreUpdateEventArgs; use Doctrine\ORM\Events; -use Doctrine\Common\EventSubscriber; +use RuntimeException; use UnicaenApp\Entity\HistoriqueAwareInterface; +use UnicaenAuth\Entity\Db\AbstractUser; +use Zend\ServiceManager\ServiceLocatorAwareInterface; +use Zend\ServiceManager\ServiceLocatorAwareTrait; /** * Listener Doctrine. * - * Modifie automatiquement l'heure et l'auteur de la création/modification - * de tout enregistrement dont la classe implémente HistoriqueAwareInterface. + * Renseigne si besoin l'heure et l'auteur de la création/modification + * de toute entité dont la classe implémente HistoriqueAwareInterface. * * Déclenchement : avant que l'enregistrement ne soit persisté (création) ou mis à jour (update). * @@ -32,11 +33,8 @@ class HistoriqueListener implements EventSubscriber, ServiceLocatorAwareInterfac protected $identity; /** - * * @param LifecycleEventArgs $args - * - * @return void - * @throws RuntimeException Aucun utilisateur connecté disponible pour la gestion de l'historique + * @throws RuntimeException Aucun utilisateur disponible pour en faire l'auteur de la création/modification */ protected function updateHistorique(LifecycleEventArgs $args) { @@ -47,45 +45,61 @@ class HistoriqueListener implements EventSubscriber, ServiceLocatorAwareInterfac return; } - // l'utilisateur connecté sera l'auteur de la création/modification - $user = null; - if (($identity = $this->getIdentity())) { - if (isset($identity['db']) && $identity['db'] instanceof AbstractUser) { - $user = $identity['db']; - /* @var $user AbstractUser */ - } - } - if (null === $user) { - throw new RuntimeException("Aucun utilisateur connecté disponible pour la gestion de l'historique."); - } - $now = new \DateTime(); - /** - * Historique - */ - if (null === $entity->getHistoCreation()) { $entity->setHistoCreation($now); } + // on tente d'abord d'obtenir l'utilisateur connecté pour en faire l'auteur de la création/modification. + $user = $this->getAuthenticatedUser(); + // si aucun utilisateur connecté n'est disponible, on utilise l'éventuel auteur existant + if (null === $user) { + $user = $entity->getHistoCreateur(); + } + // si nous ne disposons d'aucun utilisateur, basta! + if (null === $user) { + throw new RuntimeException("Aucun utilisateur disponible pour en faire l'auteur de la création/modification."); + } + if (null === $entity->getHistoCreateur()) { $entity->setHistoCreateur($user); } $entity->setHistoModificateur($user); $entity->setHistoModification($now); - + /* ce bloc a été mis en commentaire car il est inutile: cf. 2 lignes précédentes ! if (null === $entity->getHistoDestruction() && null === $entity->getHistoDestructeur()) { - $entity->setHistoModification($now) + $entity + ->setHistoModification($now) ->setHistoModificateur($user); } + */ if (null !== $entity->getHistoDestruction() && null === $entity->getHistoDestructeur()) { $entity->setHistoDestructeur($user); } } + /** + * Recherche l'utilisateur connecté pour l'utiliser comme auteur de la création/modification. + * + * @return AbstractUser + */ + private function getAuthenticatedUser() + { + $user = null; + + if (($identity = $this->getIdentity())) { + if (isset($identity['db']) && $identity['db'] instanceof AbstractUser) { + /* @var $user AbstractUser */ + $user = $identity['db']; + } + } + + return $user; + } + /** * @param LifecycleEventArgs $args */