Completed
Push — 1.x ( 2692eb...201d44 )
by Dorian
12s
created

SimpleHydratingHandler::getKey()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 1
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 1
rs 10
c 0
b 0
f 0
cc 1
eloc 1
nc 1
nop 0
1
<?php
2
namespace MetaHydrator\Handler;
3
4
use MetaHydrator\Exception\HydratingException;
5
use MetaHydrator\Exception\ValidationException;
6
use MetaHydrator\Exception\ParsingException;
7
use MetaHydrator\Parser\ParserInterface;
8
use MetaHydrator\Validator\ValidatorInterface;
9
10
/**
11
 * An implementation of HydratingHandlerInterface, as a one to one value parsing/validation.
12
 *
13
 * Class SimpleHydratingHandler
14
 * @package MetaHhydrator\Handler
15
 */
16
class SimpleHydratingHandler implements HydratingHandlerInterface
17
{
18
    /** @var string */
19
    private $key;
20
    public function getKey() { return $this->key; }
21
    public function setKey(string $key) { $this->key = $key; }
22
23
    /** @var ParserInterface */
24
    private $parser;
25
    public function getParser() { return $this->parser; }
26
    public function setParser(ParserInterface $parser) { $this->parser = $parser; }
27
28
    /** @var ValidatorInterface[] */
29
    private $validators;
30
    public function getValidators() { return $this->validators; }
31
    public function setValidators(array $validators) { $this->validators = $validators; }
32
    public function addValidator(ValidatorInterface $validator) { $this->validators[] = $validator; }
33
34
    /**
35
     * SimpleHydratingHandler constructor.
36
     * @param string $key
37
     * @param ParserInterface $parser
38
     * @param ValidatorInterface[] $validators
39
     */
40
    public function __construct(string $key, ParserInterface $parser, array $validators = [])
41
    {
42
        $this->key = $key;
43
        $this->parser = $parser;
44
        $this->validators = $validators;
45
    }
46
47
    /**
48
     * @param array $data
49
     * @param array $targetData
50
     * @param $object
51
     *
52
     * @throws HydratingException
53
     */
54
    public function handle(array $data, array &$targetData, $object = null)
55
    {
56
        if (array_key_exists($this->key, $data)) {
57
            $rawValue = $data[$this->key];
58
        } else if ($object === null) {
59
            $rawValue = null;
60
        } else {
61
            return;
62
        }
63
64
        try {
65
            $parsedValue = $this->parser->parse($rawValue);
66
        } catch (ParsingException $exception) {
67
            throw new HydratingException([ $this->key => $exception->getInnerError() ]);
68
        }
69
70
        $this->validate($parsedValue, $object);
71
72
        $targetData[$this->key] = $parsedValue;
73
    }
74
75
    /**
76
     * @param mixed $parsedValue
77
     * @param mixed $contextObject
78
     *
79
     * @throws HydratingException
80
     */
81
    private function validate($parsedValue, $contextObject = null)
82
    {
83
        try {
84
            foreach ($this->validators as $validator) {
85
                $validator->validate($parsedValue, $contextObject);
86
            }
87
        } catch (ValidationException $exception) {
88
            throw new HydratingException([ $this->key => $exception->getInnerError() ]);
89
        }
90
    }
91
}
92