Completed
Push — master ( ae5e03...0447ee )
by Jeroen
10:35 queued 04:37
created

AdminBundle/EventListener/ExceptionSubscriber.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
namespace Kunstmaan\AdminBundle\EventListener;
4
5
use Doctrine\ORM\EntityManagerInterface;
6
use Kunstmaan\AdminBundle\Entity\Exception;
7
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
8
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
9
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
10
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
11
use Symfony\Component\HttpKernel\KernelEvents;
12
13
class ExceptionSubscriber implements EventSubscriberInterface
14
{
15
    /**
16
     * @var EntityManagerInterface
17
     */
18
    private $em;
19
20
    /**
21
     * @var array
22
     */
23
    private $excludes;
24
25
    /**
26
     * @return array
0 ignored issues
show
Consider making the return type a bit more specific; maybe use array<*,string>.

This check looks for the generic type array as a return type and suggests a more specific type. This type is inferred from the actual code.

Loading history...
27
     */
28 3
    public static function getSubscribedEvents()
29
    {
30
        return [
31 3
            KernelEvents::EXCEPTION => 'onKernelException',
32
        ];
33
    }
34
35
    /**
36
     * ExceptionSubscriber constructor.
37
     *
38
     * @param EntityManagerInterface $em
39
     * @param array                  $excludes
40
     */
41
    public function __construct(EntityManagerInterface $em, array $excludes = [])
42
    {
43
        $this->em = $em;
44
        $this->excludes = $excludes;
45
    }
46
47
    /**
48
     * @param GetResponseForExceptionEvent|ExceptionEvent $event
49
     */
50
    public function onKernelException($event)
51
    {
52 View Code Duplication
        if (!$event instanceof GetResponseForExceptionEvent && !$event instanceof ExceptionEvent) {
53
            throw new \InvalidArgumentException(\sprintf('Expected instance of type %s, %s given', \class_exists(ExceptionEvent::class) ? ExceptionEvent::class : GetResponseForExceptionEvent::class, \is_object($event) ? \get_class($event) : \gettype($event)));
54
        }
55
56
        $request = $event->getRequest();
57
        $exception = \method_exists($event, 'getThrowable') ? $event->getThrowable() : $event->getException();
58
59
        if ($exception instanceof HttpExceptionInterface) {
60
            $uri = $request->getUri();
61
62
            if (\count($this->excludes) > 0) {
63
                $excludes = array_filter($this->excludes, function ($pattern) use ($uri) {
64
                    return preg_match($pattern, $uri);
65
                });
66
67
                if (\count($excludes) > 0) {
68
                    return;
69
                }
70
            }
71
72
            $hash = md5(
73
                $exception->getStatusCode().$uri.$request->headers->get('referer')
74
            );
75
76
            if ($model = $this->em->getRepository(Exception::class)->findOneBy(['hash' => $hash])) {
77
                $model->increaseEvents();
78
                $model->setResolved(false);
79
            } else {
80
                $model = new Exception();
81
                $model->setCode($exception->getStatusCode());
82
                $model->setUrl($uri);
83
                $model->setUrlReferer($request->headers->get('referer'));
84
                $model->setHash($hash);
85
            }
86
            $this->em->persist($model);
87
            $this->em->flush();
88
        }
89
    }
90
}
91