Completed
Pull Request — master (#59)
by
unknown
01:47
created

EnumValueResolver::supports()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 4
rs 10
cc 1
eloc 2
nc 1
nop 2
1
<?php
2
3
/*
4
 * This file is part of the "elao/enum" package.
5
 *
6
 * Copyright (C) Elao
7
 *
8
 * @author Elao <[email protected]>
9
 */
10
11
namespace Elao\Enum\Bridge\Symfony\HttpKernel\Controller\ArgumentResolver;
12
13
use Elao\Enum\EnumInterface;
14
use Symfony\Component\HttpFoundation\Request;
15
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
16
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;
17
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
18
19
class EnumValueResolver implements ArgumentValueResolverInterface
20
{
21
    /**
22
     * {@inheritdoc}
23
     */
24
    public function supports(Request $request, ArgumentMetadata $argument)
25
    {
26
        return is_subclass_of($argument->getType(), EnumInterface::class);
0 ignored issues
show
Bug introduced by
Due to PHP Bug #53727, is_subclass_of might return inconsistent results on some PHP versions if \Elao\Enum\EnumInterface::class can be an interface. If so, you could instead use ReflectionClass::implementsInterface.
Loading history...
27
    }
28
29
    /**
30
     * {@inheritdoc}
31
     */
32
    public function resolve(Request $request, ArgumentMetadata $argument)
33
    {
34
        /** @var EnumInterface $enumClass */
35
        $enumClass = $argument->getType();
36
        $requestValue = $request->get($argument->getName());
37
38
        if (!is_array($requestValue)) {
39
            $requestValue = [$requestValue];
40
        }
41
42
        foreach ($requestValue as $value) {
43
            if ($enumClass::accepts($value)) {
44
                yield $enumClass::get($value);
45
46
                continue;
47
            }
48
49
            if ($value !== null || !$argument->isNullable()) {
50
                throw new BadRequestHttpException(sprintf('Enum "%s" does not accept value "%s"', $enumClass, $value));
51
            }
52
53
            yield null;
54
        }
55
    }
56
}
57