RequestListener   A
last analyzed

Complexity

Total Complexity 6

Size/Duplication

Total Lines 60
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 3
Bugs 0 Features 0
Metric Value
eloc 22
c 3
b 0
f 0
dl 0
loc 60
rs 10
ccs 21
cts 21
cp 1
wmc 6

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 6 1
A onKernelRequest() 0 30 5
1
<?php
2
3
namespace Palmtree\CanonicalUrlBundle\EventListener;
4
5
use Palmtree\CanonicalUrlBundle\Service\CanonicalUrlGenerator;
6
use Symfony\Component\HttpFoundation\RedirectResponse;
7
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
8
9
class RequestListener
10
{
11
    /** @var CanonicalUrlGenerator */
12
    private $canonicalUrlGenerator;
13
    /** @var bool */
14
    private $redirect;
15
    /** @var int */
16
    private $redirectCode;
17
18
    /**
19
     * KernelEventListener constructor.
20
     *
21
     * @param CanonicalUrlGenerator $urlGenerator
22
     * @param array                 $config
23
     */
24 3
    public function __construct(CanonicalUrlGenerator $urlGenerator, array $config = [])
25
    {
26 3
        $this->canonicalUrlGenerator = $urlGenerator;
27
28 3
        $this->redirect     = $config['redirect'];
29 3
        $this->redirectCode = $config['redirect_code'];
30 3
    }
31
32
    /**
33
     * Listener for the 'kernel.request' event.
34
     *
35
     * @param GetResponseEvent $event
36
     *
37
     * @return bool
38
     */
39 3
    public function onKernelRequest(GetResponseEvent $event)
40
    {
41 3
        $request = $event->getRequest();
42
43 3
        $route = $request->attributes->get('_route');
44
45 3
        if (!$route) {
46 1
            return false;
47
        }
48
49 2
        $params = $request->attributes->get('_route_params');
50
51
        // Get full request URL without query string.
52 2
        $requestUrl = $request->getSchemeAndHttpHost() . $request->getRequestUri();
53 2
        $requestUrl = \urldecode(\strtok($requestUrl, '?'));
54
55 2
        $redirectUrl = $this->canonicalUrlGenerator->generate($route, $params);
56
        // Compare without query string
57 2
        $canonicalUrl = \urldecode(\strtok($redirectUrl, '?'));
58
59 2
        if ($redirectUrl && \strcasecmp($requestUrl, $canonicalUrl) !== 0) {
60 1
            if ($this->redirect) {
61 1
                $response = new RedirectResponse($redirectUrl, $this->redirectCode);
62 1
                $event->setResponse($response);
63
64 1
                return true;
65
            }
66
        }
67
68 1
        return false;
69
    }
70
}
71