ExceptionListener   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 72
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 5

Test Coverage

Coverage 15.15%

Importance

Changes 1
Bugs 0 Features 1
Metric Value
wmc 8
lcom 1
cbo 5
dl 0
loc 72
rs 10
c 1
b 0
f 1
ccs 5
cts 33
cp 0.1515

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 6 1
B onKernelException() 0 52 7
1
<?php
2
3
namespace AppBundle\EventListener;
4
5
use AppBundle\Enum\Environment;
6
use AppBundle\Service\HashGenerator;
7
use Monolog\Logger;
8
use Symfony\Component\HttpFoundation\JsonResponse;
9
use Symfony\Component\HttpFoundation\Response;
10
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
11
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
12
13
/**
14
 * @author Vehsamrak
15
 */
16
class ExceptionListener
17
{
18
19
    /** @var string */
20
    private $environment;
21
22
    /** @var string */
23
    private $adminEmail;
24
25
    /** @var Logger */
26
    private $logger;
27
28 44
    public function __construct(string $environment, string $adminEmail, Logger $logger)
29
    {
30 44
        $this->environment = $environment;
31 44
        $this->adminEmail = $adminEmail;
32 44
        $this->logger = $logger;
33 44
    }
34
35
    public function onKernelException(GetResponseForExceptionEvent $event)
36
    {
37
        /** @var \Exception $exception */
38
        $exception = $event->getException();
39
40
        if ($this->environment === Environment::PRODUCTION && $exception instanceof HttpExceptionInterface && $exception->getStatusCode() >= 500) {
41
            $bugSerialNumber = HashGenerator::generate();
42
43
            $this->logger->info(
44
                sprintf(
45
                    '#%s - %s in %s at line %s',
46
                    $bugSerialNumber,
47
                    $exception->getMessage(),
48
                    $exception->getFile(),
49
                    $exception->getLine()
50
                )
51
            );
52
53
            $errorMessage = sprintf(
54
                'Wow! You probably found a bug with serial number #%s. Please report it to %s.',
55
                $bugSerialNumber,
56
                $this->adminEmail
57
            );
58
        } elseif ($exception instanceof HttpExceptionInterface && $exception->getStatusCode() < 500) {
59
            $errorMessage = $exception->getMessage();
60
        } else {
61
            $errorMessage = sprintf(
62
                '%s in %s at line %s',
63
                $exception->getMessage(),
64
                $exception->getFile(),
65
                $exception->getLine()
66
            );
67
        }
68
69
        $data = [
70
            'errors' => [
71
                $errorMessage,
72
            ],
73
        ];
74
75
        $response = new JsonResponse();
76
        $response->setContent(json_encode($data));
77
78
        if ($exception instanceof HttpExceptionInterface) {
79
            $response->setStatusCode($exception->getStatusCode());
80
            $response->headers->replace($exception->getHeaders());
81
        } else {
82
            $response->setStatusCode(Response::HTTP_INTERNAL_SERVER_ERROR);
83
        }
84
85
        $event->setResponse($response);
86
    }
87
}
88