Passed
Push — master ( 9aeaca...cc05b4 )
by Mike
03:00
created

AbstractDataProvider   A

Complexity

Total Complexity 15

Size/Duplication

Total Lines 66
Duplicated Lines 0 %

Test Coverage

Coverage 84.85%

Importance

Changes 0
Metric Value
eloc 32
dl 0
loc 66
ccs 28
cts 33
cp 0.8485
rs 10
c 0
b 0
f 0
wmc 15

3 Methods

Rating   Name   Duplication   Size   Complexity  
B convertToArray() 0 24 7
B fromArray() 0 19 7
A toArray() 0 3 1
1
<?php
2
declare(strict_types=1);
3
4
5
namespace Xervice\DataProvider\DataProvider;
6
7
/**
8
 * @method array getElements()
9
 */
10
abstract class AbstractDataProvider implements DataProviderInterface
11
{
12
    /**
13
     * @return array
14
     */
15 1
    public function toArray() : array
16
    {
17 1
        return $this->convertToArray($this);
18
    }
19
20
    /**
21
     * @param array $data
22
     */
23 1
    public function fromArray(array $data): void
24
    {
25 1
        foreach ($this->getElements() as $element) {
26 1
            $fieldname = $element['name'];
27 1
            if (isset($data[$fieldname])) {
28 1
                if ($element['is_dataprovider']) {
29
                    $dataProvider = new $element['type']();
30
                    if (\is_array($data[$fieldname])) {
31
                        $dataProvider->fromArray($data[$fieldname]);
32
                    }
33
                    $this->{$fieldname} = $dataProvider;
34 1
                } elseif ($element['is_collection']) {
35 1
                    foreach ($data[$fieldname] as $childData) {
36 1
                        $dataProvider = new $element['singleton_type']();
37 1
                        $dataProvider->fromArray($childData);
38 1
                        $this->{$fieldname}[] = $dataProvider;
39
                    }
40
                } else {
41 1
                    $this->{$fieldname} = $data[$fieldname];
42
                }
43
            }
44
        }
45 1
    }
46
47
    /**
48
     * @param \Xervice\DataProvider\DataProvider\DataProviderInterface $provider
49
     *
50
     * @return array
51
     */
52 1
    private function convertToArray(DataProviderInterface $provider) : array
53
    {
54 1
        $data = [];
55 1
        foreach ($provider->getElements() as $element) {
0 ignored issues
show
Bug introduced by
The method getElements() does not exist on Xervice\DataProvider\Dat...r\DataProviderInterface. Since it exists in all sub-types, consider adding an abstract or default implementation to Xervice\DataProvider\Dat...r\DataProviderInterface. ( Ignorable by Annotation )

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

55
        foreach ($provider->/** @scrutinizer ignore-call */ getElements() as $element) {
Loading history...
56 1
            $fieldname = $element['name'];
57 1
            $hasMethod = 'has' . $fieldname;
58 1
            if ($provider->$hasMethod()) {
59 1
                $getMethod = 'get' . $fieldname;
60 1
                if ($element['is_dataprovider'] && $provider->{$getMethod}() instanceof DataProviderInterface) {
61
                    $data[$fieldname] = $this->convertToArray($provider->{$getMethod}());
62
                }
63 1
                elseif ($element['is_collection']) {
64 1
                    $data[$fieldname] = [];
65 1
                    foreach ($provider->{$getMethod}() as $child) {
66 1
                        $data[$fieldname][] = $child->toArray();
67
                    }
68
                }
69
                else {
70 1
                    $data[$fieldname] = $provider->{$getMethod}();
71
                }
72
            }
73
        }
74
75 1
        return $data;
76
    }
77
}