RegisteredResponseFactory::getResponse()   A
last analyzed

Complexity

Conditions 4
Paths 6

Size

Total Lines 14
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 4

Importance

Changes 0
Metric Value
dl 0
loc 14
ccs 7
cts 7
cp 1
rs 9.2
c 0
b 0
f 0
cc 4
eloc 7
nc 6
nop 2
crap 4
1
<?php
2
namespace LunixREST\Server\ResponseFactory;
3
4
use LunixREST\Server\APIResponse\APIResponse;
5
use LunixREST\Server\APIResponse\APIResponseData;
6
use LunixREST\Server\ResponseFactory\Exceptions\NotAcceptableResponseTypeException;
7
use LunixREST\Server\ResponseFactory\Exceptions\UnableToCreateAPIResponseException;
8
use LunixREST\Server\ResponseFactory\Exceptions\UnableToSerializeResponseDataException;
9
10
11
/**
12
 * A ResponseFactory implementation that allows the case-insensitive registration of APIResponseDataSerializers to a MIME type.
13
 * It then uses the registered APIResponseDataSerializers to serialize APIResponses while building them from APIResponseData.
14
 * This provides a good example on how to actually convert APIResponseData to a SteamInterface.
15
 * Class RegisteredResponseFactory
16
 * @package LunixREST\Server\ResponseFactory
17
 */
18
class RegisteredResponseFactory implements ResponseFactory
19
{
20
    /**
21
     * @var APIResponseDataSerializer[]
22
     */
23
    protected $serializers = [];
24
25
    /**
26
     * RegisteredResponseFactory constructor.
27
     * @param APIResponseDataSerializer[] $responseTypes
28
     */
29 9
    public function __construct($responseTypes = [])
30
    {
31 9
        foreach($responseTypes as $mimeType => $serializer) {
32 2
            $this->registerSerializer($mimeType, $serializer);
33
        }
34 9
    }
35
36
    /**
37
     * @param $mimeType
38
     * @param APIResponseDataSerializer $dataSerializer
39
     */
40 6
    public function registerSerializer($mimeType, APIResponseDataSerializer $dataSerializer)
41
    {
42 6
        $this->serializers[strtolower($mimeType)] = $dataSerializer;
43 6
    }
44
45
    /**
46
     * @param APIResponseData $data
47
     * @param array $acceptedMIMETypes
48
     * @return APIResponse
49
     * @throws UnableToCreateAPIResponseException
50
     * @throws UnableToSerializeResponseDataException
51
     * @throws NotAcceptableResponseTypeException
52
     */
53 3
    public function getResponse(APIResponseData $data, array $acceptedMIMETypes): APIResponse
54
    {
55 3
        if (empty($acceptedMIMETypes)) {
56 1
            $acceptedMIMETypes = $this->getSupportedMIMETypes();
57
        }
58
59 3
        foreach ($acceptedMIMETypes as $acceptedMIMEType) {
60 3
            if(isset($this->serializers[strtolower($acceptedMIMEType)])) {
61 2
                return new APIResponse($acceptedMIMEType, $this->serializers[strtolower($acceptedMIMEType)]->serialize($data));
62
            }
63
        }
64
65 1
        throw new NotAcceptableResponseTypeException("None of the acceptable types are supported");
66
    }
67
68
    /**
69
     * @return string[]
70
     */
71 7
    public function getSupportedMIMETypes(): array
72
    {
73 7
        return array_keys($this->serializers);
74
    }
75
}
76