AuthenticatedUserSavedAbstractListener.php 2.56 KB
Newer Older
1
2
3
4
<?php

namespace UnicaenAuth\Event\Listener;

5
6
use UnicaenApp\Service\EntityManagerAwareInterface;
use UnicaenApp\Service\EntityManagerAwareTrait;
7
use UnicaenAuth\Entity\Db\AbstractUser;
8
use UnicaenAuth\Event\UserAuthenticatedEvent;
9
10
11
12
use UnicaenAuth\Service\Traits\UserContextServiceAwareTrait;
use Zend\EventManager\EventManagerInterface;
use Zend\EventManager\ListenerAggregateInterface;
use Zend\EventManager\ListenerAggregateTrait;
13
14
15
16

/**
 * Classe abstraites pour les classes désirant scruter un événement déclenché lors de l'authentification
 * utilisateur.
17
 *
18
19
 * Événements disponibles :
 * - juste avant que l'entité utilisateur ne soit persistée.
20
 * - juste après que l'entité utilisateur ait été persistée.
21
 *
22
23
24
 * @author Bertrand GAUTHIER <bertrand.gauthier at unicaen.fr>
 * @see UserAuthenticatedEvent
 */
25
abstract class AuthenticatedUserSavedAbstractListener implements ListenerAggregateInterface, EntityManagerAwareInterface
26
{
27
    use ListenerAggregateTrait;
28
    use EntityManagerAwareTrait;
29
    use UserContextServiceAwareTrait;
30

31
    /**
32
     * @var callable[]
33
     */
34
35
    protected $listeners = [];

36
    /**
37
     * Méthode appelée juste avant que l'entité utilisateur soit persistée.
38
     *
39
     * @param UserAuthenticatedEvent $e
40
     * @return void
41
     */
42
43
    public function onUserAuthenticatedPrePersist(UserAuthenticatedEvent $e)
    {
44
45
        /** @var AbstractUser $user */
        $user = $e->getDbUser();
46

47
48
        // Sélection du dernier rôle endossé.
        $this->selectLastUserRole($user);
49
50
51
52
53
54
    }

    /**
     * Méthode appelée juste après que l'entité utilisateur soit persistée.
     *
     * @param UserAuthenticatedEvent $e
55
     * @return void
56
57
58
     */
    public function onUserAuthenticatedPostPersist(UserAuthenticatedEvent $e)
    {
59
60
        // nop
    }
61

62
63
64
65
66
    protected function selectLastUserRole(AbstractUser $user)
    {
        if ($role = $user->getLastRole()) {
            $this->serviceUserContext->setNextSelectedIdentityRole($role);
        }
67
    }
68
69

    /**
70
     * {@inheritdoc}
71
     */
72
    public function attach(EventManagerInterface $events, $priority = 1)
73
    {
74
75
        $sharedEvents = $events->getSharedManager();

76
        $this->listeners[] = $sharedEvents->attach(
77
78
79
80
81
82
83
84
85
86
            'UnicaenAuth\Service\User',
            UserAuthenticatedEvent::PRE_PERSIST,
            [$this, 'onUserAuthenticatedPrePersist'],
            100);

        $this->listeners[] = $sharedEvents->attach(
            'UnicaenAuth\Service\User',
            UserAuthenticatedEvent::POST_PERSIST,
            [$this, 'onUserAuthenticatedPostPersist'],
            100);
87
88
    }
}