src/Listener/ResponseListener.php line 60

Open in your IDE?
  1. <?php
  2. namespace App\Listener;
  3. use App\Entity\User;
  4. use App\Message\LogMessage;
  5. use App\Serializer\API\UserSerializer;
  6. use Doctrine\ORM\EntityManagerInterface;
  7. use Symfony\Component\HttpFoundation\JsonResponse;
  8. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  9. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  10. use Symfony\Component\Messenger\MessageBusInterface;
  11. class ResponseListener
  12. {
  13.     private EntityManagerInterface $em;
  14.     private MessageBusInterface $bus;
  15.     public function __construct(EntityManagerInterface $emMessageBusInterface $bus)
  16.     {
  17.         $this->em $em;
  18.         $this->bus $bus;
  19.     }
  20.     /**
  21.      * @throws \JsonException
  22.      */
  23.     public function onKernelResponse(ResponseEvent $event): ResponseEvent
  24.     {
  25.         $response $event->getResponse();
  26.         $request $event->getRequest();
  27.         $user $request->attributes->get('user');
  28.         if ($response->headers->get('Content-Type') === 'application/json') {
  29.             $prevent = ['/api/login''/api/refresh''/web/login'];
  30.             if (isset($_ENV['LOGGER_KEY'], $_ENV['APP_ENV']) &&
  31.                 $_ENV['LOGGER_KEY'] &&
  32.                 $user instanceof User &&
  33.                 !in_array($request->getRequestUri(), $prevent)) {
  34.                 $data = [
  35.                     'requestHeaders' => $request->headers->all(),
  36.                     'requestContent' => $request->getContent(),
  37.                     'requestUri' => $request->getUri(),
  38.                     'requestMethod' => $request->getMethod(),
  39.                     'requestIp' => $request->getClientIp(),
  40.                     'responseCode' => $response->getStatusCode(),
  41.                     'responseContent' => json_decode($response->getContent()?:''true512JSON_THROW_ON_ERROR),
  42.                     'environment' => $_ENV['APP_ENV'],
  43.                     'user' => UserSerializer::item($user)
  44.                 ];
  45.                 $this->bus->dispatch(new LogMessage($data));
  46.             }
  47.         }
  48.         return $event;
  49.     }
  50.     public function onKernelException(ExceptionEvent $event): ExceptionEvent
  51.     {
  52.         $response = new JsonResponse(['error' => $event->getThrowable()->getMessage()]);
  53.         $event->setResponse($response);
  54.         return $event;
  55.     }
  56. }