Passed
Push — master ( f0520f...17c662 )
by Mike
04:51
created

AbstractDataProvider::convertUnderlines()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 5
nc 1
nop 1
dl 0
loc 8
ccs 6
cts 6
cp 1
crap 1
rs 10
c 0
b 0
f 0
1
<?php
2
declare(strict_types=1);
3
4
5
namespace Xervice\DataProvider\Business\Model\DataProvider;
6
7
abstract class AbstractDataProvider implements DataProviderInterface
8
{
9
    /**
10
     * @return array
11
     */
12 3
    public function toArray(): array
13
    {
14 3
        return $this->convertToArray($this);
15
    }
16
17
    /**
18
     * @param array $data
19
     */
20 3
    public function fromArray(array $data): void
21
    {
22 3
        foreach ($this->getElements() as $element) {
23 3
            $fieldname = $element['isCamelCase'] ? $this->convertUnderlines($element['name']) : $element['name'];
24 3
            if (isset($data[$fieldname])) {
25 3
                $this->setFieldFromArrayData($data, $element, $fieldname);
26
            }
27
        }
28 3
    }
29
30
    /**
31
     * @param \Xervice\DataProvider\Business\Model\DataProvider\DataProviderInterface $provider
32
     *
33
     * @return array
34
     */
35 3
    private function convertToArray(DataProviderInterface $provider): array
36
    {
37 3
        $data = [];
38 3
        foreach ($provider->getElements() as $element) {
0 ignored issues
show
Bug introduced by
The method getElements() does not exist on Xervice\DataProvider\Bus...r\DataProviderInterface. It seems like you code against a sub-type of said class. However, the method does not exist in Xervice\DataProvider\Bus...rovider\AnyDataProvider. Are you sure you never get one of those? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

38
        foreach ($provider->/** @scrutinizer ignore-call */ getElements() as $element) {
Loading history...
39 3
            $fieldname = $element['isCamelCase'] ? $this->convertUnderlines($element['name']) : $element['name'];
40 3
            $hasMethod = 'has' . $fieldname;
41 3
            if ($provider->$hasMethod()) {
42 3
                $data = $this->getDataFromFields($provider, $fieldname, $element, $data);
43
            }
44
        }
45
46 3
        return $data;
47
    }
48
49
    /**
50
     * @param array $data
51
     * @param array $element
52
     * @param string $fieldname
53
     */
54 3
    private function setFieldFromArrayData(array $data, array $element, string $fieldname): void
55
    {
56 3
        if (strpos($element['type'], 'DataProviderInterface[]') !== false) {
57 1
            $this->setChildData($data, $element, $fieldname);
58
        }
59 3
        elseif (strpos($element['type'], 'DataProviderInterface') !== false) {
60 1
            $this->setAnyDataProviderValues($data, $element, $fieldname);
61
        }
62 3
        elseif ($element['is_dataprovider']) {
63
            $this->setOneDataProviderValue($data, $element, $fieldname);
64
        }
65 3
        elseif ($element['is_collection']) {
66 1
            $this->setCollectionValues($data, $element, $fieldname);
67
        }
68
        else {
69 3
            $this->{$element['name']} = $data[$fieldname];
70
        }
71 3
    }
72
73
    /**
74
     * @param \Xervice\DataProvider\Business\Model\DataProvider\DataProviderInterface $provider
75
     * @param string $fieldname
76
     * @param array $element
77
     * @param array $data
78
     *
79
     * @return mixed
80
     */
81 3
    private function getDataFromFields(DataProviderInterface $provider, string $fieldname, array $element, array $data)
82
    {
83 3
        $getMethod = 'get' . $fieldname;
84 3
        if (strpos($element['type'], 'DataProviderInterface[]') !== false) {
85 1
            $data = $this->getDataProviderCollectionData($provider, $fieldname, $data, $getMethod);
86
        }
87
        elseif (
88 3
            strpos($element['type'], 'DataProviderInterface') !== false
89 3
            && $provider->{$getMethod}() instanceof DataProviderInterface
90
        ) {
91 1
            $anyDataProvider = new AnyDataProvider($provider->{$getMethod}());
92 1
            $data[$fieldname] = $anyDataProvider->toArray();
93
        }
94 3
        elseif ($element['is_dataprovider'] && $provider->{$getMethod}() instanceof DataProviderInterface) {
95
            $data[$fieldname] = $this->convertToArray($provider->{$getMethod}());
96
        }
97 3
        elseif ($element['is_collection']) {
98 1
            $data = $this->getCollectionData($provider, $fieldname, $data, $getMethod);
99
        }
100
        else {
101 3
            $data[$fieldname] = $provider->{$getMethod}();
102
        }
103 3
        return $data;
104
    }
105
106
    /**
107
     * @param array $data
108
     * @param array $element
109
     * @param string $fieldname
110
     */
111 1
    private function setChildData(array $data, array $element, string $fieldname): void
112
    {
113 1
        foreach ($data[$fieldname] as $childData) {
114 1
            $anyDataProvider = new AnyDataProvider();
115 1
            $anyDataProvider->fromArray($childData);
116 1
            $this->{$element['name']}[] = $anyDataProvider->getDataProvider();
117
        }
118 1
    }
119
120
    /**
121
     * @param array $data
122
     * @param array $element
123
     * @param string $fieldname
124
     */
125 1
    private function setAnyDataProviderValues(array $data, array $element, string $fieldname): void
126
    {
127 1
        $anyDataProvider = new AnyDataProvider();
128 1
        $anyDataProvider->fromArray($data[$fieldname]);
129 1
        $this->{$element['name']} = $anyDataProvider->getDataProvider();
130 1
    }
131
132
    /**
133
     * @param array $data
134
     * @param array $element
135
     * @param string $fieldname
136
     */
137
    private function setOneDataProviderValue(array $data, array $element, string $fieldname): void
138
    {
139
        $dataProvider = new $element['type']();
140
        if (\is_array($data[$fieldname])) {
141
            $dataProvider->fromArray($data[$fieldname]);
142
        }
143
        $this->{$element['name']} = $dataProvider;
144
    }
145
146
    /**
147
     * @param array $data
148
     * @param array $element
149
     * @param string $fieldname
150
     */
151 1
    private function setCollectionValues(array $data, array $element, string $fieldname): void
152
    {
153 1
        foreach ($data[$fieldname] as $childData) {
154 1
            $dataProvider = new $element['singleton_type']();
155 1
            $dataProvider->fromArray($childData);
156 1
            $this->{$element['name']}[] = $dataProvider;
157
        }
158 1
    }
159
160
    /**
161
     * @param \Xervice\DataProvider\Business\Model\DataProvider\DataProviderInterface $provider
162
     * @param string $fieldname
163
     * @param array $data
164
     * @param string $getMethod
165
     *
166
     * @return array
167
     */
168 1
    private function getDataProviderCollectionData(
169
        DataProviderInterface $provider,
170
        string $fieldname,
171
        array $data,
172
        string $getMethod
173
    ): array {
174 1
        $data[$fieldname] = [];
175 1
        foreach ($provider->{$getMethod}() as $child) {
176 1
            $anyDataProvider = new AnyDataProvider($child);
177 1
            $data[$fieldname][] = $anyDataProvider->toArray();
178
        }
179 1
        return $data;
180
    }
181
182
    /**
183
     * @param \Xervice\DataProvider\Business\Model\DataProvider\DataProviderInterface $provider
184
     * @param string $fieldname
185
     * @param array $data
186
     * @param string $getMethod
187
     *
188
     * @return array
189
     */
190 1
    private function getCollectionData(
191
        DataProviderInterface $provider,
192
        string $fieldname,
193
        array $data,
194
        string $getMethod
195
    ): array {
196 1
        $data[$fieldname] = [];
197 1
        foreach ($provider->{$getMethod}() as $child) {
198 1
            $data[$fieldname][] = $child->toArray();
199
        }
200 1
        return $data;
201
    }
202
203
    /**
204
     * @param string $methodName
205
     *
206
     * @return string
207
     */
208 1
    private function convertUnderlines(string $methodName): string
209
    {
210 1
        return preg_replace_callback(
211 1
            '@\_([a-z]{1,1})@',
212
            function ($matches) {
213 1
                return strtoupper($matches[1] ?? '');
214 1
            },
215 1
            $methodName
216
        );
217
    }
218
219
    /**
220
     * @return array
221
     */
222
    abstract protected function getElements(): array;
223
}