Completed
Push — master ( 98806f...27322f )
by Yann
02:14
created

ChainUserManager::supportsClass()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 10
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 10
ccs 5
cts 5
cp 1
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 6
nc 2
nop 1
crap 2
1
<?php
2
3
namespace Yokai\SecurityTokenBundle\Manager;
4
5
/**
6
 * @author Yann Eugoné <[email protected]>
7
 */
8
class ChainUserManager implements UserManagerInterface
9
{
10
    /**
11
     * @var UserManagerInterface[]
12
     */
13
    private $managers;
14
15
    /**
16
     * @param UserManagerInterface[] $managers
17
     */
18 8
    public function __construct($managers)
19
    {
20 8
        $this->managers = $managers;
21 8
    }
22
23
    /**
24
     * @inheritDoc
25
     */
26 1
    public function supportsClass($class)
27
    {
28
        try {
29 1
            $manager = $this->getManagerForClass($class);
30 1
        } catch (\Exception $exception) {
31 1
            return false;
32
        }
33
34 1
        return $manager instanceof UserManagerInterface;
35
    }
36
37
    /**
38
     * @inheritDoc
39
     */
40 1
    public function supportsUser($user)
41
    {
42
        try {
43 1
            $manager = $this->getManagerForUser($user);
44 1
        } catch (\Exception $exception) {
45 1
            return false;
46
        }
47
48 1
        return $manager instanceof UserManagerInterface;
49
    }
50
51
    /**
52
     * @inheritDoc
53
     */
54 2
    public function get($class, $id)
55
    {
56 2
        return $this->getManagerForClass($class)->get($class, $id);
57
    }
58
59
    /**
60
     * @inheritDoc
61
     */
62 2
    public function getClass($user)
63
    {
64 2
        return $this->getManagerForUser($user)->getClass($user);
65
    }
66
67
    /**
68
     * @inheritDoc
69
     */
70 2
    public function getId($user)
71
    {
72 2
        return $this->getManagerForUser($user)->getId($user);
73
    }
74
75
    /**
76
     * @param string $class
77
     *
78
     * @return UserManagerInterface
79
     */
80 3
    private function getManagerForClass($class)
81
    {
82 3
        $tries = [];
83
84 3
        foreach ($this->managers as $manager) {
85 3
            if ($manager->supportsClass($class)) {
86 2
                return $manager;
87
            }
88
89 2
            $tries[] = get_class($manager);
90
        }
91
92 1
        throw new \RuntimeException(
93 1
            sprintf(
94 1
                'Class "%s" is not supported by any UserManager. Tried "%s".',
95 1
                $class,
96 1
                implode('", "', $tries)
97
            )
98
        );
99
    }
100
101
    /**
102
     * @param mixed $user
103
     *
104
     * @return UserManagerInterface
105
     */
106 5
    private function getManagerForUser($user)
107
    {
108 5
        $tries = [];
109
110 5
        foreach ($this->managers as $manager) {
111 5
            if ($manager->supportsUser($user)) {
112 3
                return $manager;
113
            }
114
115 3
            $tries[] = get_class($manager);
116
        }
117
118 1
        throw new \RuntimeException(
119 1
            sprintf(
120 1
                'User "%s" is not supported by any UserManager. Tried "%s".',
121 1
                $user,
122 1
                implode('", "', $tries)
123
            )
124
        );
125
    }
126
}
127