Passed
Push — master ( 94e894...80bad9 )
by Vitalijs
01:52
created

DTOBaseBuilder::buildFromObject()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 13
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 3

Importance

Changes 3
Bugs 0 Features 0
Metric Value
c 3
b 0
f 0
dl 0
loc 13
ccs 7
cts 7
cp 1
rs 9.4285
cc 3
eloc 7
nc 3
nop 1
crap 3
1
<?php
2
/**
3
 * Created by PhpStorm.
4
 * User: vlitvinovs
5
 * Date: 2/8/17
6
 * Time: 4:28 PM
7
 */
8
9
namespace CodinPro\DataTransferObject;
10
11
class DTOBaseBuilder
12
{
13
    /** @property DTOBase $dto */
14
    private $dto;
15
16 42
    public function __construct(DTOBase $dtoBase)
17
    {
18 42
        $this->dto = $dtoBase;
19 42
    }
20
21
    /**
22
     * Build DTO from given type of data
23
     * @param $data
24
     * @throws \InvalidArgumentException
25
     */
26 42
    public function build($data)
27
    {
28 42
        switch (gettype($data)) {
29 42
            case 'array':
30 33
                $this->buildFromArray($data);
31 31
                break;
32 10
            case 'object':
33 3
                $this->buildFromObject($data);
34 3
                break;
35 8
            case 'string':
36 6
                $this->buildFromJson($data);
37 4
                break;
38
            default:
39 2
                throw new \InvalidArgumentException('DTO can be built from array|object|json, "'.gettype($data).'" given.');
40
        }
41 36
    }
42
    
43
    /**
44
     * Restrict internalDTO* fields in data
45
     * @param $data
46
     */
47 38
    private function validateFieldNames($data) {
48 38
        $restrictedFields = ['internalDTOData', 'internalDTODefault'];
49 38
        foreach ($restrictedFields as $field) {
50 38
            if ((is_array($data) && isset($data[$field])) || (is_object($data) && isset($data->{$field}))) {
51 2
                throw new \InvalidArgumentException('internalDTO* fields are restricted');
52
            }
53
        }
54 36
    }
55
56
    /**
57
     * Build DTO from provided data
58
     * @param $array
59
     */
60 33
    private function buildFromArray($array)
61
    {
62 33
        $this->validateFieldNames($array);
63
        
64 31
        foreach ($this->dto->getDefault() as $key => $value) {            
65 29
            if (isset($array[$key])) {
66 13
                $this->dto[$key] = $array[$key];
67
            } else {
68 29
                $this->dto[$key] = $value;
69
            }
70
        }
71 31
    }
72
73
    /**
74
     * Build DTO from provided data
75
     * @param $object
76
     */
77 6
    private function buildFromObject($object)
78
    {
79 6
        $this->validateFieldNames($object);
80
        
81 6
        foreach ($this->dto->getDefault() as $key => $value) {
82
            
83 6
            if (isset($object->{$key})) {
84 6
                $this->dto[$key] = $object->{$key};
85
            } else {
86 5
                $this->dto[$key] = $value;
87
            }
88
        }
89 6
    }
90
91
    /**
92
     * Try to build from provided string as JSON
93
     * @param string $data
94
     * @throws \InvalidArgumentException
95
     */
96 6
    private function buildFromJson($data)
97
    {
98 6
        $triedToDecodeData = json_decode($data);
99
100 6
        if ($triedToDecodeData !== null) {
101 4
            $this->buildFromObject($triedToDecodeData);
102
        } else {
103 2
            throw new \InvalidArgumentException(
104 2
                'DTO can be built from array|object|json, "'.gettype($data).'" given. Probably tried to pass invalid JSON.'
105
            );
106
        }
107 4
    }
108
}
109