Completed
Pull Request — master (#556)
by
unknown
33:10
created

CatchAttributesListener::onKernelRequest()   B

Complexity

Conditions 8
Paths 9

Size

Total Lines 39

Duplication

Lines 0
Ratio 0 %

Importance

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