Completed
Pull Request — master (#556)
by
unknown
58:26 queued 23:30
created

CatchAttributesListener::getSubscribedEvents()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 6
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
3
namespace FOS\HttpCacheBundle\EventListener;
4
5
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ConfigurationInterface;
6
use Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver;
7
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
8
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
9
use Symfony\Component\HttpKernel\Event\RequestEvent;
10
use Symfony\Component\HttpKernel\Kernel;
11
use Symfony\Component\HttpKernel\KernelEvents;
12
13
if (Kernel::MAJOR_VERSION >= 5) {
14
    class_alias(RequestEvent::class, 'FOS\HttpCacheBundle\EventListener\AttributeRequestEvent');
15
} else {
16
    class_alias(GetResponseEvent::class, 'FOS\HttpCacheBundle\EventListener\AttributeRequestEvent');
17
}
18
19
class CatchAttributesListener implements EventSubscriberInterface
20
{
21
    /**
22
     * @var ControllerResolver
23
     */
24
    private $controllerResolver;
25
26
    public function __construct(ControllerResolver $controllerResolver)
27
    {
28
        $this->controllerResolver = $controllerResolver;
29
    }
30
31
    public function onKernelRequest(AttributeRequestEvent $event)
32
    {
33
        $request = $event->getRequest();
34
35
        if (
36
            method_exists(\ReflectionProperty::class, 'getAttributes') &&
37
            $controller = $this->controllerResolver->getController($request)
38
        ) {
39
            $class = new \ReflectionClass($controller[0]);
40
            $method = $class->getMethod($controller[1]);
41
            $attributes = [];
42
            $addAttributes = function ($instance) use (&$attributes) {
43
                if (
44
                    $instance instanceof ConfigurationInterface &&
45
                    in_array(
46
                        $instance->getAliasName(), [
47
                        'tag', 'invalidate_path', 'invalidate_route',
48
                    ])
49
                ) {
50
                    $attributes['_'.$instance->getAliasName()][] = $instance;
51
                }
52
            };
53
54
            foreach ($class->getAttributes() as $classAttribute) {
55
                $addAttributes($classAttribute->newInstance());
56
            }
57
            foreach ($method->getAttributes() as $methodAttribute) {
58
                $addAttributes($methodAttribute->newInstance());
59
            }
60
61
            foreach ($attributes as $key => $attr) {
62
                $request->attributes->set(
63
                    $key,
64
                    array_merge($attr, $request->attributes->get($key, []))
65
                );
66
            }
67
        }
68
    }
69
70
    public static function getSubscribedEvents()
71
    {
72
        return [
73
            KernelEvents::REQUEST => 'onKernelRequest',
74
        ];
75
    }
76
}
77