Completed
Push — master ( 530f3a...b8358f )
by Siim
10:54
created

RequestHandler::getAvailableRoutes()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 0
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php
2
/**
3
 * Created by PhpStorm.
4
 * User: siim
5
 * Date: 17.01.19
6
 * Time: 7:48
7
 */
8
9
namespace Sf4\Api\RequestHandler;
10
11
use Sf4\Api\Dto\Response\ErrorDto;
12
use Sf4\Api\Request\OptionsRequest;
13
use Sf4\Api\Request\RequestInterface;
14
use Sf4\Api\Request\RequestTrait;
15
use Sf4\Api\RequestHandler\Traits\AvailableRoutesTrait;
16
use Sf4\Api\Utils\Traits\EntitymanagerTrait;
17
use Sf4\Api\Utils\Traits\TranslatorTrait;
18
use Symfony\Component\HttpFoundation\JsonResponse;
19
use Symfony\Component\HttpFoundation\Request;
20
21
class RequestHandler implements RequestHandlerInterface
22
{
23
24
    use RequestTrait;
25
    use TranslatorTrait;
26
    use EntitymanagerTrait;
27
    use AvailableRoutesTrait;
28
29
    /**
30
     * @param Request $request
31
     */
32
    public function handle(Request $request)
33
    {
34
        try {
35
            if ($request->getMethod() === 'OPTIONS') {
36
                $this->handleOptionsRequest($request);
37
            } else {
38
                $this->handleNormalRequest($request);
39
            }
40
        } catch (\Exception $exception) {
41
            $this->handleError($exception);
42
        }
43
    }
44
45
    /**
46
     * @param Request $request
47
     * @throws \ReflectionException
48
     */
49
    protected function handleOptionsRequest(Request $request)
50
    {
51
        $this->createRequestClass(OptionsRequest::class);
52
        $this->getRequest()->handle($request);
53
    }
54
55
    /**
56
     * @param string $requestClassName
57
     */
58
    protected function createRequestClass(string $requestClassName)
59
    {
60
        /** @var RequestInterface $request */
61
        $request = new $requestClassName();
62
63
        if ($request instanceof RequestInterface) {
0 ignored issues
show
introduced by
$request is always a sub-type of Sf4\Api\Request\RequestInterface.
Loading history...
64
            $this->setRequest($request);
65
            $request->setRequestHandler($this);
66
        }
67
    }
68
69
    /**
70
     * @param Request $request
71
     * @throws \ReflectionException
72
     */
73
    protected function handleNormalRequest(Request $request)
74
    {
75
        $routes = $this->getAvailableRoutes();
76
        $route = $request->attributes->get('_route');
77
        if (array_key_exists($route, $routes)) {
78
            $requestClassName = $routes[$route];
79
            $this->handleRequestClass($request, $requestClassName);
80
        }
81
    }
82
83
    /**
84
     * @param Request $request
85
     * @param string $requestClassName
86
     * @throws \ReflectionException
87
     */
88
    protected function handleRequestClass(Request $request, string $requestClassName)
89
    {
90
        $this->createRequestClass($requestClassName);
91
        $this->getRequest()->handle($request);
92
    }
93
94
    /**
95
     * @param \Exception $exception
96
     */
97
    protected function handleError(\Exception $exception)
98
    {
99
        $request = $this->getRequest();
100
        if ($request) {
101
            $response = $request->getResponse();
102
            if ($response) {
103
                $errorDto = new ErrorDto();
104
                $errorDto->error = $exception->getMessage();
105
                $response->setResponseDto($errorDto);
106
            }
107
        }
108
    }
109
110
    /**
111
     * @return JsonResponse|null
112
     */
113
    public function getResponse(): ?JsonResponse
114
    {
115
        $request = $this->getRequest();
116
        if ($request) {
117
            $response = $request->getResponse();
118
            if ($response) {
119
                return $response->getJsonResponse();
120
            }
121
        }
122
123
        return null;
124
    }
125
}
126