<?php
namespace App\EventSubscriber\Project;
use App\Event\Project\ProjectPropertiesChangedEvent;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Psr\Log\LoggerInterface;
/**
* EventSubscriber spécialisé pour appliquer des logiques personnalisées
* sur certaines propriétés lors de la propagation
*/
class ProjectCustomPropagationSubscriber implements EventSubscriberInterface
{
private EntityManagerInterface $em;
private LoggerInterface $logger;
public function __construct(
EntityManagerInterface $em,
LoggerInterface $logger
) {
$this->em = $em;
$this->logger = $logger;
}
public static function getSubscribedEvents(): array
{
return [
// Priorité plus élevée pour s'exécuter APRÈS le subscriber principal
ProjectPropertiesChangedEvent::class => ['onProjectPropertiesCustomLogic', -10],
];
}
public function onProjectPropertiesCustomLogic(ProjectPropertiesChangedEvent $event): void
{
$project = $event->getProject();
$changedProperties = $event->getChangedProperties();
// ✅ Vérifier d'abord si le projet a des projets attachés
$attachedProjects = $project->getAttacheds();
if ($attachedProjects->isEmpty()) {
return;
}
// Appliquer des logiques personnalisées pour certaines propriétés
foreach ($attachedProjects as $attachedProject) {
$hasCustomChanges = false;
foreach ($changedProperties as $property => $newValue) {
switch ($property) {
case 'name':
// Logique spéciale : ajouter un suffixe pour distinguer les copies
$customValue = $newValue;
$attachedProject->setName($customValue);
$hasCustomChanges = true;
$this->logger->debug("Nom personnalisé appliqué", [
'attached_project_id' => $attachedProject->getId(),
'original_name' => $newValue,
'custom_name' => $customValue
]);
break;
case 'actionName':
// Logique spéciale : préfixer l'action
$customValue = $newValue;
$attachedProject->setActionName($customValue);
$hasCustomChanges = true;
break;
// Ajoutez d'autres logiques personnalisées ici selon vos besoins
// case 'otherProperty':
// // Votre logique personnalisée
// break;
}
}
if ($hasCustomChanges) {
$this->logger->info("Logiques personnalisées appliquées au projet attaché {$attachedProject->getId()}");
}
}
// Pas de flush ici, c'est géré par le ProjectService
}
}