Completed
Branch feature/pre-split (0400ca)
by Anton
03:49
created

SchemaLocator::locateSources()   B

Complexity

Conditions 5
Paths 4

Size

Total Lines 23
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

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