SchemaLocator   A
last analyzed

Complexity

Total Complexity 10

Size/Duplication

Total Lines 74
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 3

Importance

Changes 0
Metric Value
wmc 10
lcom 0
cbo 3
dl 0
loc 74
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
B locateSchemas() 0 25 4
B locateSources() 0 23 5
1
<?php
2
/**
3
 * Spiral, Core Components
4
 *
5
 * @author Wolfy-J
6
 */
7
8
namespace Spiral\ODM\Schemas;
9
10
use Interop\Container\ContainerInterface;
11
use Spiral\Core\FactoryInterface;
12
use Spiral\Models\Reflections\ReflectionEntity;
13
use Spiral\ODM\DocumentEntity;
14
use Spiral\ODM\Entities\DocumentSource;
15
use Spiral\Tokenizer\ClassesInterface;
16
17
/**
18
 * Provides ability to automatically locate schemas in a project. Can be user redefined in order to
19
 * automatically include custom classes.
20
 *
21
 * This is lazy implementation.
22
 */
23
class SchemaLocator implements LocatorInterface
24
{
25
    /**
26
     * Container is used for lazy resolution for ClassesInterface.
27
     *
28
     * @var ContainerInterface
29
     */
30
    protected $container;
31
32
    /**
33
     * @param ContainerInterface $container
34
     */
35
    public function __construct(ContainerInterface $container)
36
    {
37
        $this->container = $container;
38
    }
39
40
    /**
41
     * {@inheritdoc}
42
     */
43
    public function locateSchemas(): array
44
    {
45
        if (!$this->container->has(ClassesInterface::class)) {
46
            return [];
47
        }
48
49
        /**
50
         * @var ClassesInterface $classes
51
         */
52
        $classes = $this->container->get(ClassesInterface::class);
53
54
        $schemas = [];
55
        foreach ($classes->getClasses(DocumentEntity::class) as $class) {
56
            if ($class['abstract']) {
57
                continue;
58
            }
59
60
            $schemas[] = $this->container->get(FactoryInterface::class)->make(
61
                DocumentSchema::class,
62
                ['reflection' => new ReflectionEntity($class['name']),]
63
            );
64
        }
65
66
        return $schemas;
67
    }
68
69
70
    /**
71
     * {@inheritdoc}
72
     */
73
    public function locateSources(): array
74
    {
75
        if (!$this->container->has(ClassesInterface::class)) {
76
            return [];
77
        }
78
79
        /**
80
         * @var ClassesInterface $classes
81
         */
82
        $classes = $this->container->get(ClassesInterface::class);
83
84
        $result = [];
85
        foreach ($classes->getClasses(DocumentSource::class) as $class) {
86
            $source = $class['name'];
87
            if ($class['abstract'] || empty($source::DOCUMENT)) {
88
                continue;
89
            }
90
91
            $result[$source::DOCUMENT] = $source;
92
        }
93
94
        return $result;
95
    }
96
}