Passed
Push — master ( cc05b4...b9cd46 )
by Mike
05:29
created

AbstractDataProvider   A

Complexity

Total Complexity 22

Size/Duplication

Total Lines 87
Duplicated Lines 0 %

Test Coverage

Coverage 90.2%

Importance

Changes 0
Metric Value
eloc 51
dl 0
loc 87
ccs 46
cts 51
cp 0.902
rs 10
c 0
b 0
f 0
wmc 22

3 Methods

Rating   Name   Duplication   Size   Complexity  
A toArray() 0 3 1
B convertToArray() 0 34 11
B fromArray() 0 30 10
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 2
    public function toArray() : array
16
    {
17 2
        return $this->convertToArray($this);
18
    }
19
20
    /**
21
     * @param array $data
22
     */
23 2
    public function fromArray(array $data): void
24
    {
25 2
        foreach ($this->getElements() as $element) {
26
27 2
            $fieldname = $element['name'];
28 2
            if (isset($data[$fieldname])) {
29 2
                if (strpos($element['type'], 'DataProviderInterface[]') !== false) {
30 1
                    foreach ($data[$fieldname] as $childData) {
31 1
                        $anyDataProvider = new AnyDataProvider();
32 1
                        $anyDataProvider->fromArray($childData);
33 1
                        $this->{$fieldname}[] = $anyDataProvider->getDataProvider();
34
                    }
35 2
                } elseif (strpos($element['type'], 'DataProviderInterface') !== false) {
36 1
                    $anyDataProvider = new AnyDataProvider();
37 1
                    $anyDataProvider->fromArray($data[$fieldname]);
38 1
                    $this->{$fieldname} = $anyDataProvider->getDataProvider();
39 2
                } elseif ($element['is_dataprovider']) {
40
                    $dataProvider = new $element['type']();
41
                    if (\is_array($data[$fieldname])) {
42
                        $dataProvider->fromArray($data[$fieldname]);
43
                    }
44
                    $this->{$fieldname} = $dataProvider;
45 2
                } elseif ($element['is_collection']) {
46 1
                    foreach ($data[$fieldname] as $childData) {
47 1
                        $dataProvider = new $element['singleton_type']();
48 1
                        $dataProvider->fromArray($childData);
49 1
                        $this->{$fieldname}[] = $dataProvider;
50
                    }
51
                } else {
52 2
                    $this->{$fieldname} = $data[$fieldname];
53
                }
54
            }
55
        }
56 2
    }
57
58
    /**
59
     * @param \Xervice\DataProvider\DataProvider\DataProviderInterface $provider
60
     *
61
     * @return array
62
     */
63 2
    private function convertToArray(DataProviderInterface $provider) : array
64
    {
65 2
        $data = [];
66 2
        foreach ($provider->getElements() as $element) {
0 ignored issues
show
Bug introduced by
The method getElements() does not exist on Xervice\DataProvider\Dat...r\DataProviderInterface. It seems like you code against a sub-type of Xervice\DataProvider\Dat...r\DataProviderInterface such as Xervice\DataProvider\Dat...er\AbstractDataProvider. ( Ignorable by Annotation )

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

66
        foreach ($provider->/** @scrutinizer ignore-call */ getElements() as $element) {
Loading history...
67 2
            $fieldname = $element['name'];
68 2
            $hasMethod = 'has' . $fieldname;
69 2
            if ($provider->$hasMethod()) {
70 2
                $getMethod = 'get' . $fieldname;
71 2
                if (strpos($element['type'], 'DataProviderInterface[]') !== false) {
72 1
                    $data[$fieldname] = [];
73 1
                    foreach ($provider->{$getMethod}() as $child) {
74 1
                        $anyDataProvider = new AnyDataProvider($child);
75 1
                        $data[$fieldname][] = $anyDataProvider->toArray();
76
                    }
77
                } elseif (
78 2
                    strpos($element['type'], 'DataProviderInterface') !== false
79 2
                    && $provider->{$getMethod}() instanceof DataProviderInterface
80
                ) {
81 1
                    $anyDataProvider = new AnyDataProvider($provider->{$getMethod}());
82 1
                    $data[$fieldname] = $anyDataProvider->toArray();
83 2
                } elseif ($element['is_dataprovider'] && $provider->{$getMethod}() instanceof DataProviderInterface) {
84
                    $data[$fieldname] = $this->convertToArray($provider->{$getMethod}());
85 2
                } elseif ($element['is_collection']) {
86 1
                    $data[$fieldname] = [];
87 1
                    foreach ($provider->{$getMethod}() as $child) {
88 1
                        $data[$fieldname][] = $child->toArray();
89
                    }
90
                } else {
91 2
                    $data[$fieldname] = $provider->{$getMethod}();
92
                }
93
            }
94
        }
95
96 2
        return $data;
97
    }
98
}