Completed
Push — master ( 5724f6...93ca06 )
by Alexpts
02:09
created

src/PTS/DataTransformer/ModelClosure.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
namespace PTS\DataTransformer;
3
4
class ModelClosure
5
{
6
    /** @var \Closure */
7
    protected $fill;
8
    /** @var \Closure */
9
    protected $data;
10
11
    /**
12
     * @param string $key
13
     * @param array $propRule
14 4
     * @param mixed $default
15
     * @return mixed
16 4
     */
17 4
    static public function getKey($key, array $propRule = [], $default = null)
0 ignored issues
show
As per PSR2, the static declaration should come after the visibility declaration.
Loading history...
18
    {
19
        return array_key_exists($key, $propRule) ? $propRule[$key] : $default;
20 4
    }
21
22
    /**
23
     * @return \Closure
24
     */
25
    public function getToDataFn()
26 4
    {
27
        if (!$this->data) {
28 2
            $this->data = $this->createDataFn();
29 2
        }
30
31 2
        return $this->data;
32 2
    }
33 2
34 2
    /**
35
     * @return \Closure
36 2
     */
37 2
    protected function createDataFn() {
38 2
        return function (array $mapping, DataTransformer $transformer) {
39 2
            $typeConverter = $transformer->getConverter();
40 2
            $props = [];
41 2
42
            foreach ($mapping as $name => $propRule) {
43
                $getter = ModelClosure::getKey('get', $propRule);
44 2
                $propVal = ModelClosure::getKey('prop', $propRule);
45 2
                $val = null;
46
47
                if ($getter) {
48
                    $method = is_array($getter) ? $getter[0] : $getter;
49 2
                    $args = is_array($getter) ? $getter[1] : [];
50 4
                    $val = call_user_func_array([$this, $method], $args);
51
                } elseif ($propVal) {
52
                    $val = $this->{$propVal};
53
                }
54
55
                if ($val !== null) {
56 4
                    $props[$name] = $typeConverter->toData($val, $propRule, $transformer);
57
                }
58 4
            }
59 4
60
            return $props;
61
        };
62 4
    }
63
64
    /**
65
     * @return \Closure
66
     */
67
    public function getFillFn()
68
    {
69
        if (!$this->fill) {
70 4
            $this->fill = $this->createFillFn();
71 2
        }
72
73 2
        return $this->fill;
74 2
    }
75 1
76
    /**
77
     * @return \Closure
78 2
     */
79
    protected function createFillFn()
80 2
    {
81 2
        return function(array $doc, array $mapping, DataTransformer $transformer) {
82
            $typeConverter = $transformer->getConverter();
83 2
84
            foreach ($doc as $name => $val) {
85 2
                if (!array_key_exists($name, $mapping)) {
86 2
                    continue;
87 2
                }
88
89 4
                $propRule = $mapping[$name];
90
91
                $modelName = ModelClosure::getKey('prop', $propRule);
92
                $setter = ModelClosure::getKey('set', $propRule);
93
94
                $val = $typeConverter->toModel($val, $propRule, $transformer);
95
96
                $setter
97
                    ? call_user_func([$this, $setter], $val)
98
                    : $this->{$modelName} = $val;
99
            }
100
        };
101
    }
102
}