Completed
Pull Request — develop (#625)
by Narcotic
11:27 queued 06:45
created

ProxyCacheListener::onKernelResponse()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 20
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 0
Metric Value
dl 0
loc 20
ccs 0
cts 16
cp 0
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 12
nc 3
nop 1
crap 12
1
<?php
2
/**
3
 * listener that invalidates a server cache in front of graviton, if so configured
4
 */
5
namespace Graviton\CacheBundle\Listener;
6
7
use FOS\HttpCacheBundle\CacheManager;
8
use FOS\HttpCacheBundle\Http\SymfonyResponseTagger;
9
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
10
11
/**
12
 * @author   List of contributors <https://github.com/libgraviton/graviton/graphs/contributors>
13
 * @license  http://opensource.org/licenses/gpl-license.php GNU Public License
14
 * @link     http://swisscom.ch
15
 */
16
class ProxyCacheListener
17
{
18
19
    /**
20
     * @var SymfonyResponseTagger
21
     */
22
    private $responseTagger;
23
24
    /**
25
     * @var CacheManager
26
     */
27
    private $cacheManager;
28
29
    /**
30
     * which methods should be tagged
31
     *
32
     * @var array
33
     */
34
    private $tagOnMethodes = [
35
        'GET',
36
        'OPTIONS',
37
        'HEAD'
38
    ];
39
40
    /**
41
     * tag that every item should receive
42
     *
43
     * @var array
44
     */
45
    private $baseTags = [
46
        'all'
47
    ];
48
49
    /**
50
     * set ResponseTagger
51
     *
52
     * @param SymfonyResponseTagger $responseTagger responseTagger
53
     *
54
     * @return void
55
     */
56
    public function setResponseTagger($responseTagger)
57
    {
58
        $this->responseTagger = $responseTagger;
59
    }
60
61
    /**
62
     * set CacheManager
63
     *
64
     * @param CacheManager $cacheManager cacheManager
65
     *
66
     * @return void
67
     */
68
    public function setCacheManager($cacheManager)
69
    {
70
        $this->cacheManager = $cacheManager;
71
    }
72
73
    /**
74
     * add a IfNoneMatch header to the response
75
     *
76
     * @param FilterResponseEvent $event response listener event
77
     *
78
     * @return void
79
     */
80
    public function onKernelResponse(FilterResponseEvent $event)
81
    {
82
83
        $routeName = $event->getRequest()->get('_route');
84
        $routeParts = explode('.', $routeName);
85
        $routeType = end($routeParts);
86
        array_pop($routeParts);
87
        $tags = [implode('.', $routeParts)];
88
89
        if (in_array($event->getRequest()->getMethod(), $this->tagOnMethodes)) {
90
            $this->responseTagger->addTags(array_merge($this->baseTags, $tags));
91
        } else {
92
            // if something is done within i18n, we delete everything
93
            if ($routeParts[1] == 'i18n') {
94
                $tags[] = 'all';
95
            }
96
97
            $this->cacheManager->invalidateTags($tags);
98
        }
99
    }
100
}
101