src/EventSubscriber/LivingCostStatisticsReadSubscriber.php line 65

  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\GeneralMetrics\GeneralMetricsOperations;
  4. use App\CityMetrics\CityMetricsOperations;
  5. use App\Entity\LivingCostStatistics;
  6. use App\Repository\CityMetricsRepository;
  7. use App\Repository\GeneralMetricsRepository;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\HttpKernel\KernelEvents;
  10. use Symfony\Component\HttpKernel\Event\ViewEvent;
  11. use ApiPlatform\Symfony\EventListener\EventPriorities;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. /**
  14.  * Subscribes to reading of a LivingCostStatistics entity.
  15.  * Happens in GET operations in this system's case.
  16.  */
  17. final class LivingCostStatisticsReadSubscriber implements EventSubscriberInterface
  18. {
  19.     /**
  20.      * Constructor.
  21.      *
  22.      * @param GeneralMetricsRepository $generalMetricsRepository
  23.      * @param CityMetricsRepository    $cityMetricsRepository
  24.      * @param GeneralMetricsOperations $generalMetricsOperations
  25.      * @param CityMetricsOperations    $cityMetricsOperations
  26.      */
  27.     public function __construct(
  28.         private GeneralMetricsRepository $generalMetricsRepository,
  29.         private CityMetricsRepository $cityMetricsRepository,
  30.         private GeneralMetricsOperations $generalMetricsOperations,
  31.         private CityMetricsOperations $cityMetricsOperations
  32.     ) {
  33.     }
  34.     /**
  35.      * Returns which events are subscribed to.
  36.      *
  37.      * @return void
  38.      */
  39.     public static function getSubscribedEvents()
  40.     {
  41.         return [
  42.             KernelEvents::VIEW => [
  43.                 ['onRead'EventPriorities::PRE_SERIALIZE],
  44.             ],
  45.         ];
  46.     }
  47.     /**
  48.      * Increments metrics data when an entity is read.
  49.      *   - CityMetrics if a LivingCostStatistics entity is read for a specific City
  50.      *   - GeneralMetrics if any LivingCostStatistics entity is read
  51.      *
  52.      * @param ViewEvent $event
  53.      *
  54.      * @return void
  55.      */
  56.     public function onRead(ViewEvent $event): void
  57.     {
  58.         $request $event->getRequest();
  59.         $apiMetricsPath $request->attributes->get('_route_params')['_api_operation_name'];
  60.         $method $request->getMethod();
  61.         if (LivingCostStatistics::GET_RESOURCE_PATH != $apiMetricsPath
  62.             && LivingCostStatistics::GET_COLLECTION_PATH != $apiMetricsPath
  63.             || !in_array($method, [Request::METHOD_GET])
  64.         ) {
  65.             return;
  66.         }
  67.         if (LivingCostStatistics::GET_RESOURCE_PATH == $apiMetricsPath) {
  68.             $resources[] = $event->getControllerResult();
  69.         } else {
  70.             $resources $event->getControllerResult();
  71.         }
  72.         foreach ($resources as $resource) {
  73.             $cityMetrics $this->cityMetricsOperations->incrementForLivingCostStatistics($resource);
  74.             $this->cityMetricsRepository->save($cityMetricstrue);
  75.             $generalMetrics $this->generalMetricsOperations->increment();
  76.             $this->generalMetricsRepository->save($generalMetricstrue);
  77.         }
  78.     }
  79. }