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

Mapper::populateRelations()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 7
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 5
nc 2
nop 2
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
}