Passed
Pull Request — master (#85)
by Sergei
02:08
created

Normalizer::normalize()   B

Complexity

Conditions 11
Paths 9

Size

Total Lines 38
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 18
CRAP Score 11.353

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 20
c 2
b 0
f 0
dl 0
loc 38
ccs 18
cts 21
cp 0.8571
rs 7.3166
cc 11
nc 9
nop 3
crap 11.353

How to fix   Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Factory\Definition;
6
7
use Yiisoft\Factory\Exception\InvalidConfigException;
8
9
use function array_key_exists;
10
use function is_array;
11
use function is_callable;
12
use function is_object;
13
use function is_string;
14
15
/**
16
 * Class Definition represents a definition in a container
17
 */
18
class Normalizer
19
{
20
    /**
21
     * Definition may be defined multiple ways.
22
     * Interface name as string:
23
     *
24
     * ```php
25
     * $container->set('interface_name', EngineInterface::class);
26
     * ```
27
     *
28
     * A closure:
29
     *
30
     * ```php
31
     * $container->set('closure', function($container) {
32
     *     return new MyClass($container->get('db'));
33
     * });
34
     * ```
35
     *
36
     * A callable array:
37
     *
38
     * ```php
39
     * $container->set('static_call', [MyClass::class, 'create']);
40
     * ```
41
     *
42
     * A definition array:
43
     *
44
     * ```php
45
     * $container->set('full_definition', [
46
     *     'class' => EngineMarkOne::class,
47
     *     '__construct()' => [42],
48
     *     '$argName' => 'value',
49
     *     'setX()' => [42],
50
     * ]);
51
     * ```
52
     *
53
     * @param mixed $definition
54
     *
55
     * @throws InvalidConfigException
56
     */
57 25
    public static function normalize($definition, string $id = null, array $constructorArguments = []): DefinitionInterface
58
    {
59 25
        if ($definition instanceof DefinitionInterface) {
60 1
            return $definition;
61
        }
62
63 25
        if (is_string($definition)) {
64 18
            if (empty($definition)) {
65
                throw new InvalidConfigException('Invalid definition: empty string.');
66
            }
67 18
            if ($id === $definition || (!empty($constructorArguments) && class_exists($definition))) {
68
                /** @psalm-var class-string $definition */
69 6
                return new ArrayDefinition([
70 6
                    ArrayDefinition::CLASS_NAME => $definition,
71 6
                    ArrayDefinition::CONSTRUCTOR => $constructorArguments,
72
                ]);
73
            }
74 12
            return Reference::to($definition);
75
        }
76
77 11
        if (is_callable($definition, true)) {
78 3
            return new CallableDefinition($definition);
79
        }
80
81 8
        if (is_array($definition)) {
82 7
            $config = $definition;
83 7
            if (!array_key_exists(ArrayDefinition::CLASS_NAME, $config)) {
84
                $config[ArrayDefinition::CLASS_NAME] = $id;
85
            }
86
            /** @psalm-suppress ArgumentTypeCoercion */
87 7
            return new ArrayDefinition($config);
88
        }
89
90 1
        if (is_object($definition)) {
91 1
            return new ValueDefinition($definition);
92
        }
93
94
        throw new InvalidConfigException('Invalid definition:' . var_export($definition, true));
95
    }
96
97
    /**
98
     * Validates definition for correctness.
99
     *
100
     * @param mixed $definition {@see normalize()}
101
     *
102
     * @throws InvalidConfigException
103
     */
104
    public static function validate($definition, bool $throw = true): bool
105
    {
106
        if ($definition instanceof DefinitionInterface) {
107
            return true;
108
        }
109
110
        if (is_string($definition) && !empty($definition)) {
111
            return true;
112
        }
113
114
        if (is_callable($definition)) {
115
            return true;
116
        }
117
118
        if (is_array($definition)) {
119
            return true;
120
        }
121
122
        if (is_object($definition)) {
123
            return true;
124
        }
125
126
        if ($throw) {
127
            throw new InvalidConfigException('Invalid definition:' . var_export($definition, true));
128
        }
129
130
        return false;
131
    }
132
}
133