RequestsLocator   A
last analyzed

Complexity

Total Complexity 13

Size/Duplication

Total Lines 78
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Importance

Changes 0
Metric Value
wmc 13
lcom 1
cbo 4
dl 0
loc 78
rs 10
c 0
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
B scan() 0 22 5
A isClass() 0 4 2
A isTypedArray() 0 4 3
A locate() 0 12 2
1
<?php
2
/**
3
 * Spiral Framework, IDE Helper
4
 *
5
 * @author    Dmitry Mironov <[email protected]>
6
 * @licence   MIT
7
 */
8
9
namespace Spiral\IdeHelper\Locators;
10
11
use Psr\Http\Message\UploadedFileInterface;
12
use Spiral\Http\Request\RequestFilter;
13
use Spiral\IdeHelper\Model\ClassDefinition;
14
use Spiral\IdeHelper\Model\ClassProperty;
15
use Spiral\Models\Reflections\ReflectionEntity;
16
use Spiral\Tokenizer\ClassesInterface;
17
18
/**
19
 * Class RequestsLocator
20
 *
21
 * @package Spiral\IdeHelper\Locators
22
 */
23
class RequestsLocator implements LocatorInterface
24
{
25
    /**
26
     * @var ClassesInterface
27
     */
28
    private $classes;
29
30
    /**
31
     * RequestsLocator constructor.
32
     *
33
     * @param ClassesInterface $classes
34
     */
35
    public function __construct(ClassesInterface $classes)
36
    {
37
        $this->classes = $classes;
38
    }
39
40
    /**
41
     * @inheritdoc
42
     */
43
    public function locate(): array
44
    {
45
        $classes = [];
46
        $classNames = array_keys($this->classes->getClasses(RequestFilter::class));
47
48
        foreach ($classNames as $className) {
49
            $members = $this->scan($className);
50
            $classes[] = new ClassDefinition($className, $members);
51
        }
52
53
        return $classes;
54
    }
55
56
    /**
57
     * @param string $class
58
     * @return array
59
     */
60
    private function scan(string $class): array
61
    {
62
        $properties = [];
63
64
        $r = new ReflectionEntity($class);
65
66
        foreach ($r->getSchema() as $field => $definition) {
67
            $type = 'mixed';
68
69
            if ($this->isClass($definition)) {
70
                $type = $definition;
71
            } elseif ($this->isTypedArray($definition)) {
72
                $type = $definition[0] . '[]';
73
            } elseif (0 === strpos($definition, 'file:')) {
74
                $type = UploadedFileInterface::class;
75
            }
76
77
            $properties[] = new ClassProperty($field, $type);
78
        }
79
80
        return $properties;
81
    }
82
83
    /**
84
     * @param mixed $value
85
     * @return bool
86
     */
87
    private function isClass($value): bool
88
    {
89
        return is_string($value) && class_exists($value);
90
    }
91
92
    /**
93
     * @param mixed $value
94
     * @return bool
95
     */
96
    private function isTypedArray($value): bool
97
    {
98
        return is_array($value) && count($value) > 0 && $this->isClass($value[0]);
99
    }
100
}
101