ChainResolver::getResolver()   A
last analyzed

Complexity

Conditions 6
Paths 8

Size

Total Lines 16
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 6

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 6
eloc 9
nc 8
nop 1
dl 0
loc 16
ccs 9
cts 9
cp 1
crap 6
rs 9.2222
c 1
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Prozorov\Repositories\Resolvers;
6
7
use Prozorov\Repositories\Contracts\{RepositoryInterface, ResolverInterface};
8
use Prozorov\Repositories\Exceptions\CouldNotResolve;
9
10
class ChainResolver implements ResolverInterface
11
{
12
    /**
13
     * @var array $chain
14
     */
15
    protected $chain;
16
17
    /**
18
     * @var array $resolvers
19
     */
20
    protected $resolvers;
21
22 5
    public function __construct(array $chain)
23
    {
24 5
        $this->chain = $chain;
25 5
    }
26
27
    /**
28
     * @inheritDoc
29
     */
30 5
    public function resolve(string $className): RepositoryInterface
31
    {
32 5
        foreach ($this->chain as $resolverName) {
33 5
            $resolver = $this->getResolver($resolverName);
34
35
            try {
36 4
                return $resolver->resolve($className);
37 3
            } catch (CouldNotResolve $exception) {
38 3
                continue;
39
            }
40
        }
41
42 2
        $exception = new CouldNotResolve();
43 2
        $exception->setRepositoryCode($className);
44
45 2
        throw $exception;
46
    }
47
48
    /**
49
     * Create resolver if needed and return it
50
     *
51
     * @access	protected
52
     * @param	string|ResolverInterface	$code	
53
     * @return	ResolverInterface
54
     */
55 5
    protected function getResolver($resolver): ResolverInterface
56
    {
57 5
        $resolverClass = is_object($resolver) ? get_class($resolver) : $resolver;
58
59 5
        if (empty($this->resolvers[$resolverClass])) {
60 5
            if (is_object($resolver)) {
61 3
                $this->resolvers[$resolverClass] = $resolver;
62 2
            } elseif (is_string($resolver) && class_exists($resolver)) {
63 1
                $this->resolvers[$resolverClass] = new $resolver;
64
            } else {
65 1
                throw new \InvalidArgumentException('Invalid resolver provided');
66
            }
67
68
        }
69
        
70 4
        return $this->resolvers[$resolverClass];
71
    }
72
}
73