Test Failed
Push — master ( 9d4b9b...94e894 )
by Vitalijs
02:02
created

DTOBaseBuilder::validateFieldNames()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 4.25

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 8
ccs 3
cts 4
cp 0.75
rs 9.2
cc 4
eloc 5
nc 3
nop 1
crap 4.25
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 33
                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 38
    }
42
    
43
    /**
44
     * Restrict internalDTO* fields in data
45
     * @param $data
46
     */
47 36
    private function validateFieldNames($data) {
48 36
        $restrictedFields = ['internalDTOData', 'internalDTODefault'];
49
        foreach ($restrictedFields as $field) {
50
            if (isset($data[$field]) || isset($data->{$field})) {
51 36
                throw new \InvalidArgumentException('internalDTO* fields are restricted');
52
            }
53
        }
54
    }
55
56
    /**
57 33
     * Build DTO from provided data
58
     * @param $array
59 33
     */
60 31
    private function buildFromArray($array)
61
    {
62 31
        $this->validateFieldNames($array);
63 13
        
64
        foreach ($this->dto->getDefault() as $key => $value) {            
65 31
            if (isset($array[$key])) {
66
                $this->dto[$key] = $array[$key];
67
            } else {
68 33
                $this->dto[$key] = $value;
69
            }
70
        }
71
    }
72
73
    /**
74 6
     * Build DTO from provided data
75
     * @param $object
76 6
     */
77 6
    private function buildFromObject($object)
78
    {
79 6
        $this->validateFieldNames($object);
80 6
        
81
        foreach ($this->dto->getDefault() as $key => $value) {
82 5
            
83
            if (isset($object->{$key})) {
84
                $this->dto[$key] = $object->{$key};
85 6
            } else {
86
                $this->dto[$key] = $value;
87
            }
88
        }
89
    }
90
91
    /**
92 6
     * Try to build from provided string as JSON
93
     * @param string $data
94 6
     * @throws \InvalidArgumentException
95
     */
96 6
    private function buildFromJson($data)
97 4
    {
98
        $triedToDecodeData = json_decode($data);
99 2
100 2
        if ($triedToDecodeData !== null) {
101
            $this->buildFromObject($triedToDecodeData);
102
        } else {
103 4
            throw new \InvalidArgumentException(
104
                'DTO can be built from array|object|json, "'.gettype($data).'" given. Probably tried to pass invalid JSON.'
105
            );
106
        }
107
    }
108
}
109