Completed
Push — master ( ead158...0c77a2 )
by Siim
12:04
created

RequestHandler::getEntityManager()   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 Doctrine\ORM\EntityManagerInterface;
12
use Sf4\Api\Request\OptionsRequest;
13
use Sf4\Api\Request\RequestInterface;
14
use Sf4\Api\Request\RequestTrait;
15
use Symfony\Component\HttpFoundation\JsonResponse;
16
use Symfony\Component\HttpFoundation\Request;
17
18
class RequestHandler implements RequestHandlerInterface
19
{
20
21
    use RequestTrait;
22
23
    /** @var array $availableRoutes */
24
    protected $availableRoutes = [];
25
26
    /** @var EntityManagerInterface $entityManager */
27
    protected $entityManager;
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
     * @return array
85
     */
86
    protected function getAvailableRoutes(): array
87
    {
88
        return $this->availableRoutes;
89
    }
90
91
    /**
92
     * @param array $availableRoutes
93
     */
94
    public function setAvailableRoutes(array $availableRoutes)
95
    {
96
        $this->availableRoutes = $availableRoutes;
97
    }
98
99
    /**
100
     * @param Request $request
101
     * @param string $requestClassName
102
     * @throws \ReflectionException
103
     */
104
    protected function handleRequestClass(Request $request, string $requestClassName)
105
    {
106
        $this->createRequestClass($requestClassName);
107
        $this->getRequest()->handle($request);
108
    }
109
110
    /**
111
     * @param \Exception $exception
112
     */
113
    protected function handleError(\Exception $exception)
114
    {
115
        $request = $this->getRequest();
116
        if ($request) {
117
            $response = $request->getResponse();
118
            if ($response) {
119
                $response->setData([
120
                    'error' => $exception->getMessage()
121
                ]);
122
            }
123
        }
124
    }
125
126
    /**
127
     * @return JsonResponse|null
128
     */
129
    public function getResponse(): ?JsonResponse
130
    {
131
        $request = $this->getRequest();
132
        if ($request) {
133
            $response = $request->getResponse();
134
            if ($response) {
135
                return $response->getJsonResponse();
136
            }
137
        }
138
139
        return null;
140
    }
141
142
    /**
143
     * @return EntityManagerInterface
144
     */
145
    public function getEntityManager(): EntityManagerInterface
146
    {
147
        return $this->entityManager;
148
    }
149
150
    /**
151
     * @param EntityManagerInterface $entityManager
152
     */
153
    public function setEntityManager(EntityManagerInterface $entityManager): void
154
    {
155
        $this->entityManager = $entityManager;
156
    }
157
}
158