src/EventSubscriber/LivingCostStatisticsReadSubscriber.php line 65
<?php
namespace App\EventSubscriber;
use App\GeneralMetrics\GeneralMetricsOperations;
use App\CityMetrics\CityMetricsOperations;
use App\Entity\LivingCostStatistics;
use App\Repository\CityMetricsRepository;
use App\Repository\GeneralMetricsRepository;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use ApiPlatform\Symfony\EventListener\EventPriorities;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* Subscribes to reading of a LivingCostStatistics entity.
* Happens in GET operations in this system's case.
*/
final class LivingCostStatisticsReadSubscriber implements EventSubscriberInterface
{
/**
* Constructor.
*
* @param GeneralMetricsRepository $generalMetricsRepository
* @param CityMetricsRepository $cityMetricsRepository
* @param GeneralMetricsOperations $generalMetricsOperations
* @param CityMetricsOperations $cityMetricsOperations
*/
public function __construct(
private GeneralMetricsRepository $generalMetricsRepository,
private CityMetricsRepository $cityMetricsRepository,
private GeneralMetricsOperations $generalMetricsOperations,
private CityMetricsOperations $cityMetricsOperations
) {
}
/**
* Returns which events are subscribed to.
*
* @return void
*/
public static function getSubscribedEvents()
{
return [
KernelEvents::VIEW => [
['onRead', EventPriorities::PRE_SERIALIZE],
],
];
}
/**
* Increments metrics data when an entity is read.
* - CityMetrics if a LivingCostStatistics entity is read for a specific City
* - GeneralMetrics if any LivingCostStatistics entity is read
*
* @param ViewEvent $event
*
* @return void
*/
public function onRead(ViewEvent $event): void
{
$request = $event->getRequest();
$apiMetricsPath = $request->attributes->get('_route_params')['_api_operation_name'];
$method = $request->getMethod();
if (LivingCostStatistics::GET_RESOURCE_PATH != $apiMetricsPath
&& LivingCostStatistics::GET_COLLECTION_PATH != $apiMetricsPath
|| !in_array($method, [Request::METHOD_GET])
) {
return;
}
if (LivingCostStatistics::GET_RESOURCE_PATH == $apiMetricsPath) {
$resources[] = $event->getControllerResult();
} else {
$resources = $event->getControllerResult();
}
foreach ($resources as $resource) {
$cityMetrics = $this->cityMetricsOperations->incrementForLivingCostStatistics($resource);
$this->cityMetricsRepository->save($cityMetrics, true);
$generalMetrics = $this->generalMetricsOperations->increment();
$this->generalMetricsRepository->save($generalMetrics, true);
}
}
}