<?php
namespace App\Log\EventSubscriber;
use App\Log\Entity\Log;
use App\Log\Service\LogFactory;
use Monolog\Logger;
use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class ExceptionSubscriber extends BaseSubscriber implements EventSubscriberInterface
{
protected const EVENTS = [
KernelEvents::EXCEPTION => 'onException'
];
public const EXCEPTION_OCCURRED = 'exception_occurred';
/**
* @var LogFactory
*/
protected LogFactory $logFactory;
/**
* ExceptionSubscriber constructor.
* @param LogFactory $logFactory
* @param ContainerBagInterface $containerBag
*/
public function __construct(LogFactory $logFactory, ContainerBagInterface $containerBag)
{
$this->logFactory = $logFactory;
parent::__construct($containerBag);
}
/**
* @return string[]
*/
public static function getSubscribedEvents(): array
{
return self::EVENTS;
}
/**
* @param ExceptionEvent $event
*/
public function onException(ExceptionEvent $event): void
{
if ($this->supports($event->getRequest()->getUri())) {
$event->getRequest()->attributes->set(self::EXCEPTION_OCCURRED, true);
$this->logFactory->log(Logger::ERROR,
'Error: ' . $event->getThrowable()->getCode(),
[
'message' => $event->getThrowable()->getMessage(),
'trace' => $event->getThrowable()->getTraceAsString()
],
Log::TYPE_ERROR
);
}
}
}