AbstractNormalizer   A
last analyzed

Complexity

Total Complexity 3

Size/Duplication

Total Lines 88
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Importance

Changes 0
Metric Value
wmc 3
lcom 1
cbo 2
dl 0
loc 88
rs 10
c 0
b 0
f 0

8 Methods

Rating   Name   Duplication   Size   Complexity  
A normalize() 0 6 1
A createNormalizedArray() 0 10 1
A extractMetadata() 0 4 1
extractId() 0 1 ?
extractType() 0 1 ?
extractProperties() 0 1 ?
getRawPayload() 0 1 ?
validateRawPayload() 0 1 ?
1
<?php
2
3
namespace As3\Modlr\Api;
4
5
use As3\Modlr\Metadata\EntityMetadata;
6
use As3\Modlr\Rest\RestPayload;
7
8
/**
9
 * Abstract implementation of normalizing REST payloads into arrays that can be applied to a Model.
10
 *
11
 * @author Jacob Bare <[email protected]>
12
 */
13
abstract class AbstractNormalizer implements NormalizerInterface
14
{
15
    /**
16
     * {@inheritDoc}
17
     */
18
    public function normalize(RestPayload $payload, AdapterInterface $adapter)
19
    {
20
        $rawPayload = $this->getRawPayload($payload);
21
        $this->validateRawPayload($rawPayload);
22
        return $this->createNormalizedArray($rawPayload, $adapter);
23
    }
24
25
    /**
26
     * Creates a normalized array from an raw array payload.
27
     *
28
     * @param   array               $rawPayload
29
     * @param   AdapterInterface    $adapter
30
     * @return  array
31
     */
32
    protected function createNormalizedArray(array $rawPayload, AdapterInterface $adapter)
33
    {
34
        $metadata = $this->extractMetadata($rawPayload, $adapter);
35
        // @todo Should this be wrapped in an object, or is a hash fine?
36
        return [
37
            'id'            => $this->extractId($rawPayload),
38
            'type'          => $metadata->type,
39
            'properties'    => $this->extractProperties($rawPayload, $metadata)
40
        ];
41
    }
42
43
    /**
44
     * Extracts the EntityMetadata from the raw array payload.
45
     *
46
     * @param   array               $rawPayload
47
     * @param   AdapterInterface    $adapter
48
     * @return  EntityMetadata
49
     */
50
    protected function extractMetadata(array $rawPayload, AdapterInterface $adapter)
51
    {
52
        return $adapter->getEntityMetadata($this->extractType($rawPayload));
53
    }
54
55
    /**
56
     * Takes an raw array payload and extracts the model's unique id.
57
     *
58
     * @param   array           $rawPayload
59
     * @return  string|null
60
     * @throws  NormalizerException     On failed attempts to extract the id.
61
     */
62
    abstract protected function extractId(array $rawPayload);
63
64
    /**
65
     * Takes an raw array payload and extracts the model's type.
66
     *
67
     * @param   array           $rawPayload
68
     * @return  string
69
     * @throws  NormalizerException     On failed attempts to extract the model type.
70
     */
71
    abstract protected function extractType(array $rawPayload);
72
73
    /**
74
     * Takes an raw array payload and extracts the model properties (attributes and relationships) as a flattened, key/value array.
75
     *
76
     * @param   array           $rawPayload
77
     * @param   EntityMetadata  $metadata
78
     * @return  array
79
     * @throws  NormalizerException     On failed attempts to flatten the array.
80
     */
81
    abstract protected function extractProperties(array $rawPayload, EntityMetadata $metadata);
82
83
    /**
84
     * Extracts raw array data from a REST payload.
85
     *
86
     * @param   RestPayload     $payload
87
     * @return  array
88
     * @throws  NormalizerException
89
     */
90
    abstract protected function getRawPayload(RestPayload $payload);
91
92
    /**
93
     * Validates a the raw payload array.
94
     *
95
     * @param   array   $rawPayload
96
     * @return  array
97
     * @throws  NormalizerException
98
     */
99
    abstract protected function validateRawPayload(array $rawPayload);
100
}
101