Request   A
last analyzed

Complexity

Total Complexity 13

Size/Duplication

Total Lines 111
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 9

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 13
lcom 1
cbo 9
dl 0
loc 111
ccs 35
cts 35
cp 1
rs 10
c 0
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A onKernelRequest() 0 17 3
A __construct() 0 11 1
A setLocale() 0 8 1
A getLocale() 0 17 4
A onKernelResponse() 0 10 4
1
<?php
2
/**
3
 * AnimeDb package.
4
 *
5
 * @author    Peter Gribanov <[email protected]>
6
 * @copyright Copyright (c) 2011, Peter Gribanov
7
 * @license   http://opensource.org/licenses/GPL-3.0 GPL v3
8
 */
9
namespace AnimeDb\Bundle\AppBundle\Event\Listener;
10
11
use Symfony\Component\HttpKernel\HttpKernelInterface;
12
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
13
use Gedmo\Translatable\TranslatableListener;
14
use Symfony\Component\Translation\TranslatorInterface;
15
use Symfony\Component\HttpFoundation\Request as HttpRequest;
16
use Symfony\Component\Validator\Validator\ValidatorInterface;
17
use Symfony\Component\Validator\Constraints\Locale;
18
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
19
20
class Request
21
{
22
    /**
23
     * @var TranslatorInterface
24
     */
25
    protected $translator;
26
27
    /**
28
     * @var TranslatableListener
29
     */
30
    protected $translatable;
31
32
    /**
33
     * @var ValidatorInterface
34
     */
35
    protected $validator;
36
37
    /**
38
     * @var string
39
     */
40
    protected $locale;
41
42
    /**
43
     * @param TranslatableListener $translatable
44
     * @param TranslatorInterface $translator
45
     * @param ValidatorInterface $validator
46
     * @param string $locale
47
     */
48 16
    public function __construct(
49
        TranslatableListener $translatable,
50
        TranslatorInterface $translator,
51
        ValidatorInterface $validator,
52
        $locale
53
    ) {
54 16
        $this->translatable = $translatable;
55 16
        $this->translator = $translator;
56 16
        $this->validator = $validator;
57 16
        $this->locale = $locale;
58 16
    }
59
60
    /**
61
     * @param GetResponseEvent $event
62
     */
63 4
    public function onKernelRequest(GetResponseEvent $event)
64
    {
65 4
        if ($event->getRequestType() !== HttpKernelInterface::MASTER_REQUEST) {
66 1
            return;
67
        }
68
69
        /* @var $request HttpRequest */
70 3
        $request = $event->getRequest();
71
72
        // set default locale from request
73 3
        if ($request_locale = $request->getPreferredLanguage()) {
74 2
            $request->setDefaultLocale($request_locale);
75
        }
76
77
        // reset locale
78 3
        $this->setLocale($request, $this->getLocale($request));
79 3
    }
80
81
    /**
82
     * @param HttpRequest $request
83
     * @param string $locale
84
     */
85 6
    public function setLocale(HttpRequest $request, $locale)
86
    {
87 6
        setlocale(LC_ALL, $locale);
88 6
        $locale = substr($locale, 0, 2);
89 6
        $request->setLocale($locale);
90 6
        $this->translator->setLocale($locale);
91 6
        $this->translatable->setTranslatableLocale($locale);
92 6
    }
93
94
    /**
95
     * @param HttpRequest $request
96
     *
97
     * @return string
98
     */
99 8
    public function getLocale(HttpRequest $request)
100
    {
101 8
        if ($this->locale) {
102 4
            return $this->locale;
103
        }
104
105
        // get locale from language list
106 4
        $constraint = new Locale();
107 4
        foreach ($request->getLanguages() as $language) {
108 3
            if (!$this->validator->validate($language, $constraint)->has(0)) {
109 3
                return $language;
110
            }
111
        }
112
113
        // get default locale
114 1
        return $request->getLocale();
115
    }
116
117
    /**
118
     * @param FilterResponseEvent $event
119
     */
120 4
    public function onKernelResponse(FilterResponseEvent $event)
121
    {
122 4
        if ($event->getRequestType() === HttpKernelInterface::MASTER_REQUEST) {
123 3
            $event->getResponse()->setPublic();
124
            // cache must revalidate
125 3
            if ($event->getResponse()->getLastModified() && !$event->getResponse()->getMaxAge()) {
126 1
                $event->getResponse()->headers->addCacheControlDirective('must-revalidate', true);
127
            }
128
        }
129 4
    }
130
}
131