Completed
Push — master ( 12b6d2...3645ad )
by Jakub
03:56 queued 02:00
created

PathParamsMapper::map()   A

Complexity

Conditions 4
Paths 5

Size

Total Lines 20
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 20
rs 9.2
c 0
b 0
f 0
cc 4
eloc 12
nc 5
nop 2
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