Container   A
last analyzed

Complexity

Total Complexity 14

Size/Duplication

Total Lines 89
Duplicated Lines 0 %

Test Coverage

Coverage 93.75%

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 29
c 2
b 0
f 0
dl 0
loc 89
ccs 30
cts 32
cp 0.9375
rs 10
wmc 14

7 Methods

Rating   Name   Duplication   Size   Complexity  
A getIds() 0 3 1
A delegate() 0 5 1
A getParameterBag() 0 3 1
A get() 0 18 5
A setParameterBag() 0 5 1
A __construct() 0 5 1
A has() 0 13 4
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Borodulin\Container;
6
7
use Borodulin\Container\Autowire\AutowireItemInterface;
8
use Borodulin\Container\Autowire\AutowireItemResolver;
9
use Psr\Container\ContainerInterface;
10
11
class Container implements ContainerInterface
12
{
13
    /**
14
     * @var array
15
     */
16
    private $items;
17
    /**
18
     * @var AutowireItemResolver
19
     */
20
    private $autowireItemResolver;
21
    /**
22
     * @var ContainerInterface[]
23
     */
24
    private $delegates = [];
25
    /**
26
     * @var ContainerInterface|null
27
     */
28
    private $parameterBag;
29
30 11
    public function __construct(array $items)
31
    {
32 11
        $this->items = $items;
33 11
        $this->items[ContainerInterface::class] = $this;
34 11
        $this->autowireItemResolver = new AutowireItemResolver($this);
35 11
    }
36
37
    /**
38
     * {@inheritdoc}
39
     */
40 10
    public function get($id)
41
    {
42 10
        if (isset($this->items[$id])) {
43 8
            if ($this->items[$id] instanceof AutowireItemInterface) {
44 8
                $this->items[$id] = $this->autowireItemResolver->resolve($this->items[$id]);
45
            }
46
47 6
            return $this->items[$id];
48
        }
49
50 3
        foreach ($this->delegates as $container) {
51 1
            if ($container->has($id)) {
52 1
                $this->items[$id] = $container->get($id);
53
54 1
                return $this->items[$id];
55
            }
56
        }
57 2
        throw new NotFoundException($id);
58
    }
59
60
    /**
61
     * {@inheritdoc}
62
     */
63 4
    public function has($id)
64
    {
65 4
        if (isset($this->items[$id])) {
66 3
            return true;
67
        }
68
69 1
        foreach ($this->delegates as $container) {
70
            if ($container->has($id)) {
71
                return true;
72
            }
73
        }
74
75 1
        return false;
76
    }
77
78 1
    public function getIds(): array
79
    {
80 1
        return array_keys($this->items);
81
    }
82
83 1
    public function delegate(ContainerInterface $container): self
84
    {
85 1
        $this->delegates[] = $container;
86
87 1
        return $this;
88
    }
89
90 8
    public function getParameterBag(): ?ContainerInterface
91
    {
92 8
        return $this->parameterBag;
93
    }
94
95 3
    public function setParameterBag(?ContainerInterface $parameterBag): self
96
    {
97 3
        $this->parameterBag = $parameterBag;
98
99 3
        return $this;
100
    }
101
}
102