LocaleChoosingListener   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 61
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 6

Importance

Changes 0
Metric Value
wmc 8
c 0
b 0
f 0
lcom 1
cbo 6
dl 0
loc 61
rs 10

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 6 1
B onKernelException() 0 29 7
1
<?php
2
3
namespace Alpixel\Bundle\CMSBundle\Listener;
4
5
use JMS\I18nRoutingBundle\Router\LocaleResolverInterface;
6
use Symfony\Component\HttpFoundation\RedirectResponse;
7
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
8
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
9
use Symfony\Component\HttpKernel\HttpKernelInterface;
10
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
11
12
13
/**
14
 * @author Benjamin HUBERT <[email protected]>
15
 */
16
class LocaleChoosingListener
17
{
18
    /**
19
     * @var string
20
     */
21
    private $defaultLocale;
22
    /**
23
     * @var array
24
     */
25
    private $locales;
26
    /**
27
     * @var \JMS\I18nRoutingBundle\Router\LocaleResolverInterface
28
     */
29
    private $localeResolver;
30
31
    /**
32
     * LocaleChoosingListener constructor.
33
     * @param $defaultLocale
34
     * @param array $locales
35
     * @param \JMS\I18nRoutingBundle\Router\LocaleResolverInterface $localeResolver
36
     */
37
    public function __construct($defaultLocale, array $locales, LocaleResolverInterface $localeResolver)
38
    {
39
        $this->defaultLocale = $defaultLocale;
40
        $this->locales = $locales;
41
        $this->localeResolver = $localeResolver;
42
    }
43
44
    /**
45
     * @param \Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent $event
46
     */
47
    public function onKernelException(GetResponseForExceptionEvent $event)
48
    {
49
        if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
50
            return;
51
        }
52
53
        $request = $event->getRequest();
54
        if ('' !== rtrim($request->getPathInfo(), '/')) {
55
            return;
56
        }
57
58
        $ex = $event->getException();
59
        if (!$ex instanceof NotFoundHttpException || !$ex->getPrevious() instanceof ResourceNotFoundException) {
60
            return;
61
        }
62
63
        $locale = $this->localeResolver->resolveLocale($request, $this->locales) ?: $this->defaultLocale;
64
        $request->setLocale($locale);
65
66
        $params = $request->query->all();
67
        unset($params['hl']);
68
69
        $event->setResponse(
70
            new RedirectResponse(
71
                $request->getBaseUrl().'/'.$locale.'/'.($params ? '?'.http_build_query($params) : ''),
72
                301
73
            )
74
        );
75
    }
76
}
77