SimpleHydratingHandler::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 6
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 4
nc 1
nop 3
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
21
    /** @var ParserInterface */
22
    private $parser;
23
24
    /** @var ValidatorInterface[] */
25
    private $validators;
26
27
    /**
28
     * SimpleHydratingHandler constructor.
29
     * @param string $key
30
     * @param ParserInterface $parser
31
     * @param ValidatorInterface[] $validators
32
     */
33
    public function __construct($key, $parser, $validators = [])
34
    {
35
        $this->key = $key;
36
        $this->parser = $parser;
37
        $this->validators = $validators;
38
    }
39
40
    /**
41
     * @param array $data
42
     * @param array $targetData
43
     * @param null $object
44
     *
45
     * @throws HydratingException
46
     */
47
    public function handle(array $data, array &$targetData, $object = null)
48
    {
49
        if (array_key_exists($this->key, $data)) {
50
            $rawValue = $data[$this->key];
51
        } else if ($object === null) {
52
            $rawValue = null;
53
        } else {
54
            return;
55
        }
56
57
        try {
58
            $targetData[$this->key] = $this->parser->parse($rawValue);
59
        } catch (ParsingException $exception) {
60
            throw new HydratingException([ $this->key => $exception->getInnerError() ]);
61
        }
62
63
        $this->validate($targetData, $object);
64
    }
65
66
    /**
67
     * @param array $parsedData
68
     * @param mixed $contextObject
69
     *
70
     * @throws HydratingException
71
     */
72
    private function validate($parsedData, $contextObject = null)
73
    {
74
        try {
75
            foreach ($this->validators as $validator) {
76
                $validator->validate($parsedData[$this->key], $contextObject);
77
            }
78
        } catch (ValidationException $exception) {
79
            throw new HydratingException([ $this->key => $exception->getInnerError() ]);
80
        }
81
    }
82
}
83