src/EventSubscriber/Project/ProjectCustomPropagationSubscriber.php line 35

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber\Project;
  3. use App\Event\Project\ProjectPropertiesChangedEvent;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Psr\Log\LoggerInterface;
  7. /**
  8.  * EventSubscriber spécialisé pour appliquer des logiques personnalisées
  9.  * sur certaines propriétés lors de la propagation
  10.  */
  11. class ProjectCustomPropagationSubscriber implements EventSubscriberInterface
  12. {
  13.     private EntityManagerInterface $em;
  14.     private LoggerInterface $logger;
  15.     public function __construct(
  16.         EntityManagerInterface $em,
  17.         LoggerInterface $logger
  18.     ) {
  19.         $this->em $em;
  20.         $this->logger $logger;
  21.     }
  22.     public static function getSubscribedEvents(): array
  23.     {
  24.         return [
  25.             // Priorité plus élevée pour s'exécuter APRÈS le subscriber principal
  26.             ProjectPropertiesChangedEvent::class => ['onProjectPropertiesCustomLogic', -10],
  27.         ];
  28.     }
  29.     public function onProjectPropertiesCustomLogic(ProjectPropertiesChangedEvent $event): void
  30.     {
  31.         $project $event->getProject();
  32.         $changedProperties $event->getChangedProperties();
  33.         // ✅ Vérifier d'abord si le projet a des projets attachés
  34.         $attachedProjects $project->getAttacheds();
  35.         if ($attachedProjects->isEmpty()) {
  36.             return;
  37.         }
  38.         // Appliquer des logiques personnalisées pour certaines propriétés
  39.         foreach ($attachedProjects as $attachedProject) {
  40.             $hasCustomChanges false;
  41.             foreach ($changedProperties as $property => $newValue) {
  42.                 switch ($property) {
  43.                     case 'name':
  44.                         // Logique spéciale : ajouter un suffixe pour distinguer les copies
  45.                         $customValue $newValue;
  46.                         $attachedProject->setName($customValue);
  47.                         $hasCustomChanges true;
  48.                         $this->logger->debug("Nom personnalisé appliqué", [
  49.                             'attached_project_id' => $attachedProject->getId(),
  50.                             'original_name' => $newValue,
  51.                             'custom_name' => $customValue
  52.                         ]);
  53.                         break;
  54.                     case 'actionName':
  55.                         // Logique spéciale : préfixer l'action
  56.                         $customValue $newValue;
  57.                         $attachedProject->setActionName($customValue);
  58.                         $hasCustomChanges true;
  59.                         break;
  60.                         // Ajoutez d'autres logiques personnalisées ici selon vos besoins
  61.                         // case 'otherProperty':
  62.                         //     // Votre logique personnalisée
  63.                         //     break;
  64.                 }
  65.             }
  66.             if ($hasCustomChanges) {
  67.                 $this->logger->info("Logiques personnalisées appliquées au projet attaché {$attachedProject->getId()}");
  68.             }
  69.         }
  70.         // Pas de flush ici, c'est géré par le ProjectService
  71.     }
  72. }