src/Log/EventSubscriber/RequestSubscriber.php line 72

Open in your IDE?
  1. <?php
  2. namespace App\Log\EventSubscriber;
  3. use App\Api\Response\ApiResponse;
  4. use App\Log\Service\RequestFactory;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. use Symfony\Component\HttpKernel\Event\RequestEvent;
  9. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  10. use Symfony\Component\HttpKernel\KernelEvents;
  11. class RequestSubscriber extends BaseSubscriber implements EventSubscriberInterface
  12. {
  13.     public const ID_KEY 'request_id';
  14.     protected const EVENTS = [
  15.         KernelEvents::REQUEST => 'onRequest',
  16.         KernelEvents::RESPONSE => 'onResponse'
  17.     ];
  18.     /**
  19.      * @var EntityManagerInterface
  20.      */
  21.     protected EntityManagerInterface $entityManager;
  22.     /**
  23.      * @var RequestFactory
  24.      */
  25.     protected RequestFactory $requestFactory;
  26.     /**
  27.      * RequestSubscriber constructor.
  28.      * @param EntityManagerInterface $entityTaskFactory
  29.      * @param RequestFactory $requestFactory
  30.      * @param ContainerBagInterface $containerBag
  31.      */
  32.     public function __construct(EntityManagerInterface $entityTaskFactoryRequestFactory $requestFactoryContainerBagInterface $containerBag)
  33.     {
  34.         $this->entityManager $entityTaskFactory;
  35.         $this->requestFactory $requestFactory;
  36.         parent::__construct($containerBag);
  37.     }
  38.     /**
  39.      * @return string[]
  40.      */
  41.     public static function getSubscribedEvents(): array
  42.     {
  43.         return self::EVENTS;
  44.     }
  45.     /**
  46.      * @param RequestEvent $event
  47.      */
  48.     public function onRequest(RequestEvent $event): void
  49.     {
  50.         $requestEvent $event->getRequest();
  51.         if ($event->isMainRequest() && $this->supports($requestEvent->getUri())) {
  52.             $content $requestEvent->getContent();
  53.             $requestData $content && json_decode($contenttrue) ? $requestEvent->toArray() : [$content];
  54.             $request $this->requestFactory->create($requestEvent->getUri(), $requestData$requestEvent->getClientIp());
  55.             $event->getRequest()->attributes->set(self::ID_KEY$request);
  56.         }
  57.     }
  58.     /**
  59.      * @param ResponseEvent $event
  60.      */
  61.     public function onResponse(ResponseEvent $event): void
  62.     {
  63.         $request $event->getRequest()->attributes->get(self::ID_KEY);
  64.         if ($request) {
  65.             $response $event->getResponse();
  66.             if ($response instanceof ApiResponse) {
  67.                 $responseData $this->anonymize($response->getData()) ?: [];
  68.             } else {
  69.                 $content $response->getContent();
  70.                 $responseData $content && json_decode($contenttrue) ?
  71.                     json_decode($contenttrue) : [$content];
  72.             }
  73.             $complete = !$event->getRequest()->attributes->get(ExceptionSubscriber::EXCEPTION_OCCURRED);
  74.             $this->requestFactory->update($request$responseData$response->getStatusCode(), $complete);
  75.         }
  76.     }
  77.     /**
  78.      * @param $data
  79.      * @return array
  80.      */
  81.     protected function anonymize($data): array
  82.     {
  83.         if ($this->getParam('log.anonymization')){
  84.             $keys $this->getParam('log.anonymization_keys');
  85.             array_walk_recursive($data, static function (&$item$key) use ($keys) {
  86.                 $item in_array($key$keystrue) ?  '-_🙈_-' $item;
  87.             });
  88.         }
  89.         return $data;
  90.     }
  91. }