Completed
Pull Request — master (#46)
by
unknown
02:50
created

ExceptionListener::onKernelException()   C

Complexity

Conditions 7
Paths 7

Size

Total Lines 38
Code Lines 25

Duplication

Lines 0
Ratio 0 %

Importance

Changes 4
Bugs 0 Features 0
Metric Value
c 4
b 0
f 0
dl 0
loc 38
rs 6.7272
cc 7
eloc 25
nc 7
nop 1
1
<?php
2
/*
3
 * This file is part of the KleijnWeb\SwaggerBundle package.
4
 *
5
 * For the full copyright and license information, please view the LICENSE
6
 * file that was distributed with this source code.
7
 */
8
9
namespace KleijnWeb\SwaggerBundle\EventListener;
10
11
use KleijnWeb\SwaggerBundle\Exception\InvalidParametersException;
12
use KleijnWeb\SwaggerBundle\Response\VndErrorResponse;
13
use Psr\Log\LoggerInterface;
14
use Symfony\Component\HttpFoundation\Response;
15
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
16
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
17
use Symfony\Component\Security\Core\Exception\AuthenticationException;
18
19
/**
20
 * @author John Kleijn <[email protected]>
21
 */
22
class ExceptionListener
23
{
24
    /**
25
     * @var LoggerInterface
26
     */
27
    private $logger;
28
29
    /**
30
     * @param LoggerInterface $logger
31
     */
32
    public function __construct(LoggerInterface $logger)
33
    {
34
        $this->logger = $logger;
35
    }
36
37
    /**
38
     * @param LoggerInterface $logger
39
     *
40
     * @return $this
41
     */
42
    public function setLogger(LoggerInterface $logger)
43
    {
44
        $this->logger = $logger;
45
46
        return $this;
47
    }
48
49
    /**
50
     * @param GetResponseForExceptionEvent $event
51
     */
52
    public function onKernelException(GetResponseForExceptionEvent $event)
53
    {
54
        $logRef = uniqid();
55
        $exception = $event->getException();
56
57
        if ($exception instanceof NotFoundHttpException) {
58
            $event->setResponse(new VndErrorResponse("Not found", Response::HTTP_NOT_FOUND));
59
60
            return;
61
        }
62
63
        if ($exception instanceof AuthenticationException) {
64
            $event->setResponse(new VndErrorResponse("Unauthorized", Response::HTTP_UNAUTHORIZED));
65
66
            return;
67
        }
68
69
        $code = $exception->getCode();
70
71
        if (strlen($code) !== 3) {
72
            $this->fallback($message, $code, $logRef, $exception);
73
        } else {
74
            switch (substr($code, 0, 1)) {
75
                case '4':
76
                    $message = get_class($exception) === InvalidParametersException::class ? $exception->getMessage() : 'Input Error';
77
                    $this->logger->notice("Input error [logref $logRef]: " . $exception->__toString());
78
                    break;
79
                case '5':
80
                    $message = 'Server Error';
81
                    $this->logger->error("Runtime error [logref $logRef]: " . $exception->__toString());
82
                    break;
83
                default:
84
                    $this->fallback($message, $code, $logRef, $exception);
85
            }
86
        }
87
88
        $event->setResponse(new VndErrorResponse($message, $code, $logRef));
89
    }
90
91
    /**
92
     * @param string     $message
93
     * @param string     $code
94
     * @param string     $logRef
95
     * @param \Exception $exception
96
     */
97
    private function fallback(&$message, &$code, $logRef, \Exception $exception)
98
    {
99
        $code = 500;
100
        $message = 'Server Error';
101
        $this->logger->critical("Runtime error [logref $logRef]: " . $exception->__toString());
102
    }
103
}
104