RequestHandler   A
last analyzed

Complexity

Total Complexity 18

Size/Duplication

Total Lines 129
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 57
dl 0
loc 129
rs 10
c 0
b 0
f 0
wmc 18

7 Methods

Rating   Name   Duplication   Size   Complexity  
A handleRequestClass() 0 17 3
A createRequestClass() 0 8 2
A getResponse() 0 11 3
A handleError() 0 16 3
A handleOptionsRequest() 0 7 2
A handleNormalRequest() 0 7 2
A handle() 0 10 3
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\Traits\CreateErrorDtoTrait;
12
use Sf4\Api\Event\RequestCreatedEvent;
13
use Sf4\Api\Exception\RequestNotCreatedException;
14
use Sf4\Api\Request\EmptyRequest;
15
use Sf4\Api\Request\OptionsRequest;
16
use Sf4\Api\Request\RequestInterface;
17
use Sf4\Api\Request\RequestTrait;
18
use Sf4\Api\RequestHandler\Traits\AvailableRoutesTrait;
19
use Sf4\Api\RequestHandler\Traits\CacheAdapterTrait;
20
use Sf4\Api\RequestHandler\Traits\EventDispatcherTrait;
21
use Sf4\Api\RequestHandler\Traits\ParameterBagTrait;
22
use Sf4\Api\RequestHandler\Traits\RepositoryFactoryTrait;
23
use Sf4\Api\RequestHandler\Traits\SitesTrait;
24
use Sf4\Api\Response\EmptyResponse;
25
use Sf4\Api\Utils\Traits\EntityManagerTrait;
26
use Sf4\Api\Utils\Traits\TranslatorTrait;
27
use Symfony\Component\HttpFoundation\JsonResponse;
28
use Symfony\Component\HttpFoundation\Request;
29
30
class RequestHandler implements RequestHandlerInterface
31
{
32
33
    use RequestTrait;
34
    use TranslatorTrait;
35
    use EntityManagerTrait;
36
    use AvailableRoutesTrait;
37
    use CreateErrorDtoTrait;
38
    use EventDispatcherTrait;
39
    use RepositoryFactoryTrait;
40
    use SitesTrait;
41
    use CacheAdapterTrait;
42
    use ParameterBagTrait;
43
44
    /**
45
     * @param Request $request
46
     */
47
    public function handle(Request $request)
48
    {
49
        try {
50
            if ($request->getMethod() === 'OPTIONS') {
51
                $this->handleOptionsRequest($request);
52
            } else {
53
                $this->handleNormalRequest($request);
54
            }
55
        } catch (\Exception $exception) {
56
            $this->handleError($exception);
57
        }
58
    }
59
60
    /**
61
     * @return JsonResponse|null
62
     */
63
    public function getResponse(): ?JsonResponse
64
    {
65
        $request = $this->getRequest();
66
        if ($request) {
67
            $response = $request->getResponse();
68
            if ($response) {
69
                return $response->getJsonResponse();
70
            }
71
        }
72
73
        return null;
74
    }
75
76
    /**
77
     * @param Request $httpRequest
78
     */
79
    protected function handleOptionsRequest(Request $httpRequest): void
80
    {
81
        $this->createRequestClass(OptionsRequest::class);
82
        $request = $this->getRequest();
83
        if ($request) {
84
            $request->setRequest($httpRequest);
85
            $request->handle();
86
        }
87
    }
88
89
    /**
90
     * @param string $requestClassName
91
     */
92
    protected function createRequestClass(string $requestClassName): void
93
    {
94
        /** @var RequestInterface $request */
95
        $request = new $requestClassName();
96
97
        if ($request instanceof RequestInterface) {
0 ignored issues
show
introduced by
$request is always a sub-type of Sf4\Api\Request\RequestInterface.
Loading history...
98
            $this->setRequest($request);
99
            $request->setRequestHandler($this);
100
        }
101
    }
102
103
    /**
104
     * @param Request $request
105
     */
106
    protected function handleNormalRequest(Request $request): void
107
    {
108
        $routes = $this->getAvailableRoutes();
109
        $route = $request->attributes->get('_route');
110
        if (array_key_exists($route, $routes)) {
111
            $requestClassName = $routes[$route];
112
            $this->handleRequestClass($request, $requestClassName);
113
        }
114
    }
115
116
    /**
117
     * @param Request $request
118
     * @param string $requestClassName
119
     */
120
    protected function handleRequestClass(Request $request, string $requestClassName): void
121
    {
122
        $this->createRequestClass($requestClassName);
123
124
        if ($this->getRequest()) {
125
            $this->getRequest()->setRequest($request);
126
127
            $event = new RequestCreatedEvent($this->getRequest());
128
            $this->getDispatcher()->dispatch(RequestCreatedEvent::NAME, $event);
129
130
            if ($event->getResponse()) {
131
                $this->getRequest()->setResponse($event->getResponse());
132
            } else {
133
                $this->getRequest()->handle();
134
            }
135
        } else {
136
            $this->handleError(new RequestNotCreatedException());
137
        }
138
    }
139
140
    /**
141
     * @param \Exception $exception
142
     */
143
    protected function handleError(\Exception $exception): void
144
    {
145
        $request = $this->getRequest();
146
147
        if (!$request) {
148
            $request = new EmptyRequest();
149
        }
150
151
        $response = $request->getResponse();
152
153
        if (!$response) {
154
            $response = new EmptyResponse();
155
        }
156
157
        $errorDto = $this->createErrorDto($exception);
158
        $response->setResponseDto($errorDto);
159
    }
160
}
161