Completed
Push — master ( 4edf95...ab1be0 )
by Андрей
02:23
created

ResolverByClassName   A

Complexity

Total Complexity 21

Size/Duplication

Total Lines 192
Duplicated Lines 3.65 %

Coupling/Cohesion

Components 1
Dependencies 2

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 21
c 2
b 0
f 0
lcom 1
cbo 2
dl 7
loc 192
rs 10

9 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
B resolveEntryNameByContext() 0 20 5
B resolve() 0 23 4
A buildClassNameContext() 7 17 4
A buildClassNameByEntryName() 0 22 3
A getModuleOptionsPluginManager() 0 4 1
A setModuleOptionsPluginManager() 0 6 1
A getEntryBodyNamePattern() 0 4 1
A setEntryBodyNamePattern() 0 6 1

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php
2
/**
3
 * @link    https://github.com/nnx-framework/entry-name-resolver
4
 * @author  Malofeykin Andrey  <[email protected]>
5
 */
6
namespace Nnx\EntryNameResolver;
7
8
use Nnx\ModuleOptions\ModuleOptionsPluginManagerInterface;
9
10
/**
11
 * Class EntryNameResolver
12
 *
13
 * @package Nnx\EntryNameResolver\EntryNameResolver
14
 */
15
class ResolverByClassName implements EntryNameResolverInterface
16
{
17
    /**
18
     * Менеджер настроек модулей
19
     *
20
     * @var \Nnx\ModuleOptions\ModuleOptionsPluginManagerInterface
21
     */
22
    protected $moduleOptionsPluginManager;
23
24
    /**
25
     * Паттерн по которому из имени интерфейса можно получить строку, являющеюся заготовкой для формирования имени класса
26
     *
27
     * @var string
28
     */
29
    protected $entryBodyNamePattern = '/(.+)?Interface$/';
30
31
    /**
32
     * ResolverByModuleContextMap constructor.
33
     *
34
     * @param ModuleOptionsPluginManagerInterface $moduleOptionsPluginManager
35
     */
36
    public function __construct(ModuleOptionsPluginManagerInterface $moduleOptionsPluginManager)
37
    {
38
        $this->setModuleOptionsPluginManager($moduleOptionsPluginManager);
39
    }
40
41
    /**
42
     * @inheritdoc
43
     *
44
     * @param      $entryName
45
     * @param null $context
46
     *
47
     * @return null|string
48
     * @throws \Nnx\EntryNameResolver\Exception\InvalidContextException
49
     */
50
    public function resolveEntryNameByContext($entryName, $context = null)
51
    {
52
        if (!interface_exists($entryName) && !class_exists($entryName)) {
53
            return null;
54
        }
55
56
        if (null === $context) {
57
            return $entryName;
58
        }
59
60
        $contextClass = $this->buildClassNameContext($context);
61
        $className = $this->buildClassNameByEntryName($entryName);
62
63
        $resolveByContext = $this->resolve($className, $contextClass);
64
        if (null !== $resolveByContext) {
65
            return $resolveByContext;
66
        }
67
68
        return $this->resolve($className, $className);
69
    }
70
71
    /**
72
     * Резолвинг имени класса
73
     *
74
     *
75
     * @param $className
76
     * @param $contextClass
77
     *
78
     * @return null|string
79
     */
80
    protected function resolve($className, $contextClass)
81
    {
82
        $moduleOptionsPluginManager = $this->getModuleOptionsPluginManager();
83
        if (!$moduleOptionsPluginManager->hasModuleNameByClassName($className)) {
84
            return null;
85
        }
86
        $classModuleName = $moduleOptionsPluginManager->getModuleNameByClassName($className);
87
88
        $shortClassName = substr($className, strlen($classModuleName));
89
90
        if (!$moduleOptionsPluginManager->hasModuleNameByClassName($contextClass)) {
91
            return null;
92
        }
93
        $contextModuleName = $moduleOptionsPluginManager->getModuleNameByClassName($contextClass);
94
95
        $resolvedClassName = $contextModuleName . $shortClassName;
96
97
        if (!class_exists($resolvedClassName)) {
98
            return null;
99
        }
100
101
        return $resolvedClassName;
102
    }
103
104
    /**
105
     * Получает имя класса контекста
106
     *
107
     * @param $context
108
     *
109
     * @throws Exception\InvalidContextException
110
     */
111
    public function buildClassNameContext($context)
112
    {
113
        $contextClass = $context;
114
        if (is_object($contextClass)) {
115
            $contextClass = get_class($contextClass);
116
        }
117
118 View Code Duplication
        if (!is_string($contextClass)) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
119
            $errMsg = sprintf(
120
                'Context of type %s is invalid; Context not string.',
121
                (is_object($context) ? get_class($context) : gettype($context))
122
            );
123
            throw new Exception\InvalidContextException($errMsg);
124
        }
125
126
        return $contextClass;
127
    }
128
129
130
131
    /**
132
     * Получение именки класса, на основе имени интерфейса
133
     *
134
     * @param $entryName
135
     */
136
    protected function buildClassNameByEntryName($entryName)
137
    {
138
        if (!interface_exists($entryName)) {
139
            return $entryName;
140
        }
141
142
        $interfaceParts = explode('\\', $entryName);
143
        $originalShortName = array_pop($interfaceParts);
144
145
        $entityBodyNameOutput = [];
146
        $entityBodyNamePattern = $this->getEntryBodyNamePattern();
147
        preg_match($entityBodyNamePattern, $originalShortName, $entityBodyNameOutput);
148
149
        $entityBody = $entryName;
150
        if (2 === count($entityBodyNameOutput)) {
151
            $entityBody = $entityBodyNameOutput[1];
152
        }
153
        $interfaceParts[] = $entityBody;
154
155
156
        return implode('\\', $interfaceParts);
157
    }
158
159
    /**
160
     * Возвращает менеджер настроек модулей
161
     *
162
     * @return ModuleOptionsPluginManagerInterface
163
     */
164
    public function getModuleOptionsPluginManager()
165
    {
166
        return $this->moduleOptionsPluginManager;
167
    }
168
169
    /**
170
     * Устанавливает менеджер настроек модулей
171
     *
172
     * @param ModuleOptionsPluginManagerInterface $moduleOptionsPluginManager
173
     *
174
     * @return $this
175
     */
176
    public function setModuleOptionsPluginManager(ModuleOptionsPluginManagerInterface $moduleOptionsPluginManager)
177
    {
178
        $this->moduleOptionsPluginManager = $moduleOptionsPluginManager;
179
180
        return $this;
181
    }
182
183
    /**
184
     * Возвращает паттерн по которому из имени интерфейса можно получить строку, являющеюся заготовкой для формирования имени класса
185
     *
186
     * @return string
187
     */
188
    public function getEntryBodyNamePattern()
189
    {
190
        return $this->entryBodyNamePattern;
191
    }
192
193
    /**
194
     * Устанавливает паттерн по которому из имени интерфейса можно получить строку, являющеюся заготовкой для формирования имени класса
195
     *
196
     * @param string $entryBodyNamePattern
197
     *
198
     * @return $this
199
     */
200
    public function setEntryBodyNamePattern($entryBodyNamePattern)
201
    {
202
        $this->entryBodyNamePattern = $entryBodyNamePattern;
203
204
        return $this;
205
    }
206
}
207