ParamConverterListener::apply()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 14
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 3

Importance

Changes 2
Bugs 0 Features 1
Metric Value
c 2
b 0
f 1
dl 0
loc 14
ccs 9
cts 9
cp 1
rs 9.4286
cc 3
eloc 7
nc 3
nop 2
crap 3
1
<?php
2
3
namespace Zenstruck\ControllerUtil\EventListener;
4
5
use Symfony\Component\HttpFoundation\Request;
6
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
7
use Zenstruck\ControllerUtil\ParamConverter\ParamConverter;
8
9
/**
10
 * Convert the request parameters into objects when type-hinted.
11
 *
12
 * This replicates the SensioFrameworkExtraBundle behavior but keeps it simple
13
 * and without a dependency to allow usage outside Symfony Framework apps
14
 * (Silex, ..).
15
 *
16
 * @author Benjamin Eberlei <[email protected]>
17
 * @author Kevin Bond <[email protected]>
18
 *
19
 * @see https://github.com/QafooLabs/QafooLabsNoFrameworkBundle
20
 * @see https://github.com/sensiolabs/SensioFrameworkExtraBundle
21
 */
22
class ParamConverterListener
23
{
24
    private $paramConverters;
25
26
    /**
27
     * @param ParamConverter[] $paramConverters
28
     */
29 8
    public function __construct(array $paramConverters = array())
30
    {
31 8
        $this->paramConverters = $paramConverters;
32 8
    }
33
34
    /**
35
     * @param ParamConverter $paramConverter
36
     */
37 8
    public function addParamConverter(ParamConverter $paramConverter)
38
    {
39 8
        $this->paramConverters[] = $paramConverter;
40 8
    }
41
42
    /**
43
     * @param FilterControllerEvent $event
44
     */
45 8
    public function onKernelController(FilterControllerEvent $event)
46
    {
47 8
        $controller = $event->getController();
48 8
        $request = $event->getRequest();
49
50 8
        if (is_array($controller)) {
51 2
            $reflection = new \ReflectionMethod($controller[0], $controller[1]);
52 8
        } elseif (is_string($controller)) {
53 2
            $reflection = new \ReflectionFunction($controller);
54 2
        } else {
55
            // use __invoke
56 4
            $objReflector = new \ReflectionObject($controller);
57 4
            $reflection = $objReflector->getMethod('__invoke');
58
        }
59
60 8
        foreach ($reflection->getParameters() as $param) {
61 8
            if (!$param->getClass() || $param->getClass()->isInstance($request)) {
62 8
                continue;
63
            }
64
65 8
            $this->apply($request, $param);
66 8
        }
67 8
    }
68
69
    /**
70
     * @param Request              $request
71
     * @param \ReflectionParameter $param
72
     */
73 8
    private function apply(Request $request, \ReflectionParameter $param)
74
    {
75 8
        $class = $param->getClass()->getName();
76
77 8
        foreach ($this->paramConverters as $paramConverter) {
78 8
            if (!$paramConverter->supports($class)) {
79 4
                continue;
80
            }
81
82 4
            $request->attributes->set($param->getName(), $paramConverter->getObject($request));
83
84 4
            break;
85 8
        }
86 8
    }
87
}
88