<?php
namespace App\EventListener;
use App\Service\LmsIntegration\Exceptions\LmsIntegrationExceptionInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpFoundation\Response;
class LmsIntegrationExceptionListener
{
private $logger;
public function __construct(LoggerInterface $logger)
{
$this->logger = $logger;
}
public function onKernelException(ExceptionEvent $event)
{
if (!$event->getThrowable() instanceof LmsIntegrationExceptionInterface) {
return;
}
$response = new Response($event->getThrowable()->getMessage(), $event->getThrowable()->getStatusCode());
$event->setResponse($response);
$this->log($event->getThrowable());
}
private function log(\Throwable $exception)
{
$log = [
'code' => $exception->getStatusCode(),
'message' => $exception->getMessage(),
'called' => [
'file' => $exception->getTrace()[0]['file'],
'line' => $exception->getTrace()[0]['line'],
],
'occurred' => [
'file' => $exception->getFile(),
'line' => $exception->getLine(),
],
];
if ($exception->getPrevious() instanceof \Exception) {
$log += [
'previous' => [
'message' => $exception->getPrevious()->getMessage(),
'exception' => get_class($exception->getPrevious()),
'file' => $exception->getPrevious()->getFile(),
'line' => $exception->getPrevious()->getLine(),
],
];
}
$this->logger->error(json_encode($log));
}
}