-
Notifications
You must be signed in to change notification settings - Fork 54
/
BodySubscriber.php
111 lines (101 loc) · 3.09 KB
/
BodySubscriber.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
<?php
declare(strict_types = 1);
/**
* /src/EventSubscriber/BodySubscriber.php
*
* @author TLe, Tarmo Leppänen <tarmo.leppanen@protacon.com>
*/
namespace App\EventSubscriber;
use App\Utils\JSON;
use LogicException;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use function fstat;
use function in_array;
use function is_resource;
use function is_string;
/**
* Class BodySubscriber
*
* @package App\EventSubscriber
* @author TLe, Tarmo Leppänen <tarmo.leppanen@protacon.com>
*/
class BodySubscriber implements EventSubscriberInterface
{
/**
* Returns an array of event names this subscriber wants to listen to.
*
* The array keys are event names and the value can be:
*
* * The method name to call (priority defaults to 0)
* * An array composed of the method name to call and the priority
* * An array of arrays composed of the method names to call and respective
* priorities, or 0 if unset
*
* For instance:
*
* * array('eventName' => 'methodName')
* * array('eventName' => array('methodName', $priority))
* * array('eventName' => array(array('methodName1', $priority), array('methodName2')))
*
* @return mixed[] The event names to listen to
*/
public static function getSubscribedEvents(): array
{
return [
'kernel.request' => [
'onKernelRequest',
10,
],
];
}
/**
* Implementation of BodySubscriber event. Purpose of this is to convert JSON request data to proper request
* parameters.
*
* @param GetResponseEvent $event
*
* @throws LogicException
*/
public function onKernelRequest(GetResponseEvent $event): void
{
// Get current request
$request = $event->getRequest();
$content = $request->getContent();
// Request content is empty so assume that it's ok - probably DELETE or OPTION request
if ((is_string($content) && $content === '') || (is_resource($content) && fstat($content)['size'] === 0)) {
return;
}
// If request is JSON type convert it to request parameters
if ($this->isJsonRequest($request)) {
$this->transformJsonBody($request);
}
}
/**
* Method to determine if current Request is JSON type or not.
*
* @param Request $request
*
* @return bool
*/
private function isJsonRequest(Request $request): bool
{
return in_array($request->getContentType(), [null, 'json', 'txt'], true);
}
/**
* Method to transform JSON type request to proper request parameters.
*
* @param Request $request
*
* @throws LogicException
*/
private function transformJsonBody(Request $request): void
{
/** @var string $content */
$content = $request->getContent();
/** @var array $data */
$data = JSON::decode($content, true);
$request->request->replace($data);
}
}