RestRequestHelper::resolveRestRequestOptions()   B
last analyzed

Complexity

Conditions 7
Paths 9

Size

Total Lines 28

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 18
CRAP Score 7

Importance

Changes 0
Metric Value
dl 0
loc 28
ccs 18
cts 18
cp 1
rs 8.5386
c 0
b 0
f 0
cc 7
nc 9
nop 2
crap 7
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 request.
32
     * If request is configured for REST support, returns null.
33
     *
34
     * @param Request $request
35
     * @param callable $controller
36
     * @return null|RestRequestOptions
37
     *
38
     * @internal
39
     */
40 100
    public function resolveRestRequestOptions(Request $request, callable $controller)
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
        $controllerIdentifier = $request->attributes->get('_controller');
48 40
        $options = $controllerIdentifier !== null
49 39
            ? $this->restRequestOptionsRegistry->getRestRequestOptionsForController($controllerIdentifier)
50 40
            : null;
51 40
        if ($options !== null) {
52 35
            return $options;
53
        }
54
55 5
        if (is_array($controller) && count($controller) === 2) {
56 4
            $controllerAsArray = $controller;
57 4
            if (is_object($controller[0])) {
58 3
                $controllerAsArray[0] = get_class($controller[0]);
59
            }
60 4
            $options = $this->restRequestOptionsRegistry->getRestRequestOptionsForController(
61 4
                implode('::', $controllerAsArray)
62
            );
63 4
            return $options;
64
        }
65
66 1
        return null;
67
    }
68
69
    /**
70
     * Saves options inside Request object to reuse later
71
     *
72
     * @param Request $request
73
     * @param RestRequestOptions $options
74
     */
75 96
    public function setOptionsForRequest(Request $request, RestRequestOptions $options)
76
    {
77 96
        $request->attributes->set(self::REST_OPTIONS_KEY, $options);
78 96
    }
79
80
    /**
81
     * Gets options saved inside Request object
82
     *
83
     * @param Request $request
84
     * @return RestRequestOptions
85
     */
86 21
    public function getOptionsFromRequest(Request $request): RestRequestOptions
87
    {
88 21
        return $request->attributes->get(self::REST_OPTIONS_KEY);
89
    }
90
91
    /**
92
     * Returns whether this is REST configured request.
93
     * Only works after setting Options – use resolveRestRequestOptions before that
94
     *
95
     * @param Request $request
96
     * @return bool
97
     */
98 55
    public function isRestRequest(Request $request): bool
99
    {
100 55
        return $request->attributes->has(self::REST_OPTIONS_KEY);
101
    }
102
103
    /**
104
     * Binds REST request options to this route to be able to resolve the same options when the route is matched
105
     *
106
     * @param Route $route
107
     * @param RestRequestOptions $restRequestOptions
108
     */
109 97
    public function setOptionsForRoute(Route $route, RestRequestOptions $restRequestOptions)
110
    {
111 97
        $route->setDefault(self::SERIALIZED_REST_OPTIONS_KEY, serialize($restRequestOptions));
112 97
    }
113
}
114