src/EventSubscriber/Project/ProjectPropertiesPropagationSubscriber.php line 38

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber\Project;
  3. use App\Event\Project\ProjectPropertiesChangedEvent;
  4. use App\Service\Project\ProjectService;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  7. use Psr\Log\LoggerInterface;
  8. /**
  9.  * EventSubscriber qui gère la propagation des propriétés modifiées 
  10.  * d'un projet vers ses projets attachés avec logging et logique personnalisée
  11.  */
  12. class ProjectPropertiesPropagationSubscriber implements EventSubscriberInterface
  13. {
  14.     private EntityManagerInterface $em;
  15.     private ProjectService $projectService;
  16.     private LoggerInterface $logger;
  17.     public function __construct(
  18.         EntityManagerInterface $em,
  19.         ProjectService $projectService,
  20.         LoggerInterface $logger
  21.     ) {
  22.         $this->em $em;
  23.         $this->projectService $projectService;
  24.         $this->logger $logger;
  25.     }
  26.     public static function getSubscribedEvents(): array
  27.     {
  28.         return [
  29.             ProjectPropertiesChangedEvent::class => 'onProjectPropertiesChanged',
  30.         ];
  31.     }
  32.     public function onProjectPropertiesChanged(ProjectPropertiesChangedEvent $event): void
  33.     {
  34.         $project $event->getProject();
  35.         $changedProperties $event->getChangedProperties();
  36.         // ✅ Vérifier d'abord si le projet a des projets attachés
  37.         $attachedProjects $project->getAttacheds();
  38.         if ($attachedProjects->isEmpty()) {
  39.             // Pas de projets attachés, pas de propagation nécessaire
  40.             return;
  41.         }
  42.         $this->logger->info('Propagation de TOUTES les propriétés modifiées', [
  43.             'project_id' => $project->getId(),
  44.             'project_name' => $project->getName(),
  45.             'changed_properties' => array_keys($changedProperties),
  46.             'attached_projects_count' => $attachedProjects->count()
  47.         ]);
  48.         $updatedCount 0;
  49.         foreach ($attachedProjects as $attachedProject) {
  50.             $hasChanges false;
  51.             foreach ($changedProperties as $property => $newValue) {
  52.                 $setter 'set' ucfirst($property);
  53.                 // Vérifier que la méthode setter existe
  54.                 if (method_exists($attachedProject$setter)) {
  55.                     $attachedProject->$setter($newValue);
  56.                     $hasChanges true;
  57.                     $this->logger->debug("Propriété '{$property}' mise à jour", [
  58.                         'attached_project_id' => $attachedProject->getId(),
  59.                         'new_value' => $newValue
  60.                     ]);
  61.                 }
  62.             }
  63.             if ($hasChanges) {
  64.                 $updatedCount++;
  65.             }
  66.         }
  67.         if ($updatedCount 0) {
  68.             // Pas besoin de flush ici car c'est déjà fait dans le ProjectService
  69.             $this->logger->info("Propagation terminée : {$updatedCount} projets attachés mis à jour avec " count($changedProperties) . " propriétés");
  70.         }
  71.     }
  72. }