Commit 589ef1b2 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Amélioration du HistoriqueListener: utilisation du créateur spécifié à la main...

Amélioration du HistoriqueListener: utilisation du créateur spécifié à la main si aucun utilsateur connecté disponible
parent ca573a4e
Loading
Loading
Loading
Loading
+43 −29
Changes for src/UnicaenApp/ORM/Event/Listeners/HistoriqueListener.php: 43 added lines, 29 removed lines.
Original line number Diff line number Diff line
<?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
     */