Passed
Push — master ( 70db9b...d07c69 )
by Paula
02:43
created

create()   A

Complexity

Conditions 6
Paths 7

Size

Total Lines 21
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 6
eloc 10
c 1
b 0
f 0
nc 7
nop 0
dl 0
loc 21
rs 9.2222
1
<?php
2
3
namespace Locastic\Loggastic\Metadata\LoggableContext\Factory;
4
5
use Doctrine\Common\Annotations\Reader;
6
use Locastic\Loggastic\Annotation\Loggable;
7
use Locastic\Loggastic\Metadata\LoggableContext\LoggableContextCollection;
8
use Locastic\Loggastic\Util\RecursiveClassIterator;
9
10
final class AttributeLoggableContextCollectionFactory implements LoggableContextCollectionFactoryInterface
11
{
12
    /**
13
     * @param string[] $loggablePaths
14
     */
15
    public function __construct(private readonly LoggableContextCollectionFactoryInterface $decorated, private readonly array $loggablePaths)
16
    {
17
    }
18
19
    public function create(): LoggableContextCollection
20
    {
21
        if (count($this->loggablePaths) === 0) {
22
            return new LoggableContextCollection([]);
23
        }
24
25
        $classes = [];
26
27
        if ($this->decorated) {
28
            foreach ($this->decorated->create() as $loggableClass => $config) {
29
                $classes[$loggableClass] = $config;
30
            }
31
        }
32
33
        foreach (RecursiveClassIterator::getReflectionClasses($this->loggablePaths) as $className => $reflectionClass) {
34
            if ($loggable = $this->getLoggableAttribute($reflectionClass)) {
35
                $classes[$className] = ['groups' => $loggable->getGroups()];
36
            }
37
        }
38
39
        return new LoggableContextCollection($classes);
40
    }
41
42
    private function getLoggableAttribute(\ReflectionClass $reflectionClass): ?Loggable
43
    {
44
        foreach ($reflectionClass->getAttributes() as $attribute) {
45
            if (is_a($attribute->getName(), Loggable::class, true)) {
46
                return $attribute->newInstance();
47
            }
48
        }
49
50
        return null;
51
    }
52
}
53