Completed
Push — master ( f8bee3...25dc98 )
by Paweł
12s
created

Mapper   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 46
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 7
dl 0
loc 46
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A normalizeData() 0 8 2
A populateRelations() 0 7 2
A populate() 0 14 3
1
<?php
2
/**
3
 * Created for IG Client.
4
 * User: jakim <[email protected]>
5
 * Date: 16.03.2018
6
 */
7
8
namespace Jakim\Base;
9
10
11
use Jakim\Helper\ArrayHelper;
12
13
abstract class Mapper
14
{
15
    /**
16
     * Attributes map.
17
     *
18
     * @return array
19
     */
20
    abstract protected function map(): array;
21
22
    public function normalizeData(string $class, array $data)
23
    {
24
        $envelopeKey = ArrayHelper::getValue($this->map(), "$class.envelope");
25
        if ($envelopeKey) {
26
            $data = ArrayHelper::getValue($data, $envelopeKey, []);
27
        }
28
29
        return $data;
30
    }
31
32
    public function populate(string $class, array $data, $relations = false)
33
    {
34
        $itemMap = ArrayHelper::getValue($this->map(), "$class.item", []);
35
36
        $model = new $class();
37
        foreach ($itemMap as $to => $from) {
38
            $model->$to = ArrayHelper::getValue($data, $from);
39
        }
40
41
        if ($relations) {
42
            $this->populateRelations($model, $data);
43
        }
44
45
        return $model;
46
    }
47
48
    /**
49
     * @param array $data
50
     * @param $model
51
     */
52
    private function populateRelations($model, array $data): void
53
    {
54
        $class = get_class($model);
55
        $relationsMap = ArrayHelper::getValue($this->map(), "$class.relations", []);
56
        foreach ($relationsMap as $to => $class) {
57
            $relationData = $this->normalizeData($class, $data);
58
            $model->$to = $this->populate($class, $relationData);
59
        }
60
    }
61
62
}