PathParamsMapper   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 41
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 2

Importance

Changes 0
Metric Value
wmc 8
lcom 0
cbo 2
dl 0
loc 41
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A map() 0 20 4
A isParamRequired() 0 4 1
A assertRequiredParamIsPresent() 0 10 3
1
<?php
2
declare(strict_types=1);
3
4
namespace Eps\Req2CmdBundle\Params\ParameterMapper;
5
6
use Eps\Req2CmdBundle\Exception\ParamMapperException;
7
use Symfony\Component\HttpFoundation\Request;
8
9
class PathParamsMapper implements ParamMapperInterface
10
{
11
    private const REQUIRED_PROPERTY_PREFIX = '!';
12
13
    public function map(Request $request, array $propsMap): array
14
    {
15
        $pathProps = $propsMap['path'] ?? [];
16
        $result = [];
17
        foreach ($pathProps as $paramName => $paramValue) {
18
            if ($this->isParamRequired($paramName)) {
19
                $paramName = substr($paramName, 1);
20
                $this->assertRequiredParamIsPresent($paramName, $request);
21
            }
22
23
            if (!$request->attributes->has($paramName)) {
24
                continue;
25
            }
26
27
            $finalPropName = $paramValue ?? $paramName;
28
            $result[$finalPropName] = $request->attributes->get($paramName);
29
        }
30
31
        return $result;
32
    }
33
34
    private function isParamRequired(string $paramName): bool
35
    {
36
        return strpos($paramName, self::REQUIRED_PROPERTY_PREFIX) === 0;
37
    }
38
39
    private function assertRequiredParamIsPresent(string $paramName, Request $request): void
40
    {
41
        if (!$request->attributes->has($paramName)) {
42
            throw ParamMapperException::noParamFound($paramName);
43
        }
44
45
        if ($request->attributes->get($paramName) === null) {
46
            throw ParamMapperException::paramEmpty($paramName);
47
        }
48
    }
49
}
50