<?phpnamespace App\EventSubscriber;use App\Entity\WebList;use App\Entity\Selection;use App\Entity\WebFilter;use App\Service\ProductApi;use App\Entity\EditionsPlanner;use App\Service\FilterCalculationService;use Doctrine\ORM\EntityManagerInterface;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpKernel\KernelEvents;use Symfony\Component\HttpKernel\Event\ViewEvent;use ApiPlatform\Core\EventListener\EventPriorities;use ApiPlatform\Core\Util\RequestAttributesExtractor;use Symfony\Component\EventDispatcher\EventSubscriberInterface;final class CalculateFilterResultsSubscriber implements EventSubscriberInterface{ /** * @var EntityManagerInterface */ protected $em; /** * @var ProductApi */ protected $productApi; /** * @var FilterCalculationService */ protected $filterCalculationService; public function __construct(EntityManagerInterface $em, ProductApi $productApi, FilterCalculationService $filterCalculationService) { $this->em = $em; $this->productApi = $productApi; $this->filterCalculationService = $filterCalculationService; // new FilterCalculationService($em, $productApi); } public static function getSubscribedEvents(): array { return [ KernelEvents::VIEW => ['postPersist', EventPriorities::POST_WRITE], ]; } public function postPersist(ViewEvent $event): void { $object = $event->getControllerResult(); $request = $event->getRequest(); if(!$object instanceof WebList && !$object instanceof Selection && !$object instanceof WebFilter) { return; } if(!in_array($request->getMethod(), [Request::METHOD_POST, Request::METHOD_PUT])){ return; } $attributes = RequestAttributesExtractor::extractAttributes($request); // ND 24/07/2024 : maintenant que le code de calcul des filtres est optimisé, on fait les traitements directement à l'enregistrement - fini les tâches de fond switch ($attributes['resource_class']) { case WebList::class: $selectionId = $object->getSelection()->getId(); $this->filterCalculationService->deleteResultsForSelection($selectionId); $this->filterCalculationService->calculateSelection($selectionId); break; case Selection::class: $selectionId = $object->getId(); $this->filterCalculationService->deleteResultsForSelection($selectionId); $this->filterCalculationService->calculateSelection($selectionId); break; case WebFilter::class: $filterId = $object->getId(); $this->filterCalculationService->deleteResultsForFilter($filterId); $this->filterCalculationService->calculateFilterOnAllWebSelection($filterId); break; default: return; } return;/* // on choppe toutes les taches edition planner de type FilterCalculationService en attente -> si y'en a on return $tasks = $this->em->getRepository(EditionsPlanner::class)->findBy(['serviceName' => '\App\Service\FilterCalculationService', 'state' => 0]); // On vérifie si une tâche similaire est déjà en attente if(count($tasks) > 0) { foreach($tasks as $task) { $param = unserialize($task->getParams()); if(isset($param['selection']) && $object instanceof Selection && $param['selection'] == $object->getId()) { return; } if(isset($param['selection']) && $object instanceof WebList && $param['selection'] == $object->getSelection()->getId()) { return; } if(isset($param['filter']) && $object instanceof WebFilter && $param['filter'] == $object->getId()) { return; } } } $attributes = RequestAttributesExtractor::extractAttributes($request); $task = new EditionsPlanner(); $task->setServiceName('\App\Service\FilterCalculationService'); $task->setLog('En attente'); $task->setState(0); $task->setCreatedAt(new \DateTime()); $task->setProcessedAt(null); $taskParams = array(); $tmpName = 'selection'; switch ($attributes['resource_class']) { case WebList::class: $taskParams['selection'] = $object->getSelection()->getId(); break; case Selection::class: $taskParams['selection'] = $object->getId(); break; case WebFilter::class: $taskParams['filter'] = $object->getId(); $tmpName = 'filter'; break; default: return; } $task->setParams(serialize($taskParams)); $task->setName("calcul_web_" . $tmpName . "_" . (new \DateTime())->format('YmdHis')); $this->em->persist($task); $this->em->flush();*/ }}