ResponseRenderer::renderResponse()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 9
rs 9.6666
c 0
b 0
f 0
cc 1
eloc 5
nc 1
nop 3
1
<?php
2
3
declare (strict_types=1);
4
5
namespace Oxidmod\RestBundle\Response;
6
7
use League\Fractal\Manager;
8
use League\Fractal\Resource\Collection;
9
use League\Fractal\Resource\Item;
10
use League\Fractal\Resource\NullResource;
11
use League\Fractal\Resource\ResourceInterface;
12
use League\Fractal\TransformerAbstract;
13
use Oxidmod\RestBundle\Transformer\Exception\UnsupportedObjectException;
14
use Symfony\Component\HttpFoundation\Response;
15
16
/**
17
 * Response renderer
18
 */
19
class ResponseRenderer
20
{
21
    /**
22
     * @var Manager
23
     */
24
    private $fractalManager;
25
26
    /**
27
     * @var TransformerAbstract
28
     */
29
    private $transformer;
30
31
    /**
32
     * @param Manager $fractalManager
33
     * @param TransformerAbstract $transformer
34
     */
35
    public function __construct(
36
        Manager $fractalManager,
37
        TransformerAbstract $transformer
38
    ) {
39
        $this->fractalManager = $fractalManager;
40
        $this->transformer = $transformer;
41
    }
42
43
    /**
44
     * @param mixed $data
45
     * @param int $httpCode
46
     * @param string|null $resourceKey
47
     *
48
     * @return Response
49
     *
50
     * @throws \InvalidArgumentException
51
     * @throws UnsupportedObjectException
52
     */
53
    public function renderResponse($data, int $httpCode, string $resourceKey = null): Response
54
    {
55
        $resource = $this->createResource($data, $resourceKey);
56
57
        return new Response(
58
            $this->fractalManager->createData($resource)->toJson(),
59
            $httpCode
60
        );
61
    }
62
63
    /**
64
     * @param mixed $data
65
     * @param string|null $resourceKey
66
     *
67
     * @return ResourceInterface
68
     */
69
    private function createResource($data, string $resourceKey = null): ResourceInterface
70
    {
71
        if (null === $data) {
72
            return new NullResource();
73
        }
74
75
        if (is_array($data) || $data instanceof \Traversable) {
76
            return new Collection($data, $this->transformer, $resourceKey);
77
        }
78
79
        return new Item($data, $this->transformer, $resourceKey);
80
    }
81
}
82