Test Setup Failed
Pull Request — master (#5)
by
unknown
24:03
created

RestRequestHelper   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 122
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 13
lcom 1
cbo 4
dl 0
loc 122
ccs 31
cts 31
cp 1
rs 10
c 0
b 0
f 0

7 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A resolveRestRequestOptionsForRequest() 0 9 2
B resolveRestRequestOptionsForController() 0 25 6
A setOptionsForRequest() 0 4 1
A getOptionsFromRequest() 0 4 1
A isRestRequest() 0 4 1
A setOptionsForRoute() 0 4 1
1
<?php
2
declare(strict_types=1);
3
4
namespace Paysera\Bundle\ApiBundle\Service;
5
6
use Paysera\Bundle\ApiBundle\Entity\RestRequestOptions;
7
use Symfony\Component\HttpFoundation\Request;
8
use Symfony\Component\Routing\Route;
9
10
class RestRequestHelper
11
{
12
    const REST_OPTIONS_KEY = 'paysera_api_options';
13
    const SERIALIZED_REST_OPTIONS_KEY = 'paysera_api_options.serialized';
14
15
    /**
16
     * @var RestRequestOptionsRegistry
17
     */
18
    private $restRequestOptionsRegistry;
19
20
    /**
21
     * @param RestRequestOptionsRegistry $restRequestOptionsRegistry
22
     *
23
     * @internal
24
     */
25 102
    public function __construct(RestRequestOptionsRegistry $restRequestOptionsRegistry)
26
    {
27 102
        $this->restRequestOptionsRegistry = $restRequestOptionsRegistry;
28 102
    }
29
30
    /**
31
     * Resolves REST related options for current route.
32
     * If request is configured for via annotations for REST support, returns RestRequestOptions.
33
     *
34
     * @param Request $request
35
     *
36
     * @return RestRequestOptions|null
37
     *
38
     * @internal
39
     */
40 100
    public function resolveRestRequestOptionsForRequest(Request $request)
41
    {
42 100
        $serialized = $request->attributes->get(self::SERIALIZED_REST_OPTIONS_KEY);
43 100
        if ($serialized !== null) {
44 60
            return unserialize($serialized);
45
        }
46
47 40
        return null;
48 40
    }
49 39
50 40
    /**
51 40
     * Resolves REST related options for current request.
52 35
     * If request is configured via custom configuration for REST support, returns RestRequestOptions.
53
     *
54
     * @param Request $request
55 5
     * @param callable $controller
56 4
     *
57 4
     * @return RestRequestOptions|null
58 3
     *
59
     * @internal
60 4
     */
61 4
    public function resolveRestRequestOptionsForController(Request $request, callable $controller)
62
    {
63 4
        $controllerIdentifier = $request->attributes->get('_controller');
64
        $options = $controllerIdentifier !== null
65
            ? $this->restRequestOptionsRegistry->getRestRequestOptionsForController($controllerIdentifier)
66 1
            : null
67
        ;
68
        if ($options !== null) {
69
            return $options;
70
        }
71
72
        if (is_array($controller) && count($controller) === 2) {
73
            $controllerAsArray = $controller;
74
            if (is_object($controller[0])) {
75 96
                $controllerAsArray[0] = get_class($controller[0]);
76
            }
77 96
            $options = $this->restRequestOptionsRegistry->getRestRequestOptionsForController(
78 96
                implode('::', $controllerAsArray)
79
            );
80
81
            return $options;
82
        }
83
84
        return null;
85
    }
86 21
87
    /**
88 21
     * Saves options inside Request object to reuse later
89
     *
90
     * @param Request $request
91
     * @param RestRequestOptions $options
92
     */
93
    public function setOptionsForRequest(Request $request, RestRequestOptions $options)
94
    {
95
        $request->attributes->set(self::REST_OPTIONS_KEY, $options);
96
    }
97
98 55
    /**
99
     * Gets options saved inside Request object
100 55
     *
101
     * @param Request $request
102
     * @return RestRequestOptions
103
     */
104
    public function getOptionsFromRequest(Request $request): RestRequestOptions
105
    {
106
        return $request->attributes->get(self::REST_OPTIONS_KEY);
107
    }
108
109 97
    /**
110
     * Returns whether this is REST configured request.
111 97
     * Only works after setting options in kernel.request or kernel.controller
112 97
     *
113
     * @param Request $request
114
     * @return bool
115
     */
116
    public function isRestRequest(Request $request): bool
117
    {
118
        return $request->attributes->has(self::REST_OPTIONS_KEY);
119
    }
120
121
    /**
122
     * Binds REST request options to this route to be able to resolve the same options when the route is matched
123
     *
124
     * @param Route $route
125
     * @param RestRequestOptions $restRequestOptions
126
     */
127
    public function setOptionsForRoute(Route $route, RestRequestOptions $restRequestOptions)
128
    {
129
        $route->setDefault(self::SERIALIZED_REST_OPTIONS_KEY, serialize($restRequestOptions));
130
    }
131
}
132