<?php
namespace App\EventSubscriber\Project;
use App\Event\Project\ProjectPropertiesChangedEvent;
use App\Service\Project\ProjectService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Psr\Log\LoggerInterface;
/**
* EventSubscriber qui gère la propagation des propriétés modifiées
* d'un projet vers ses projets attachés avec logging et logique personnalisée
*/
class ProjectPropertiesPropagationSubscriber implements EventSubscriberInterface
{
private EntityManagerInterface $em;
private ProjectService $projectService;
private LoggerInterface $logger;
public function __construct(
EntityManagerInterface $em,
ProjectService $projectService,
LoggerInterface $logger
) {
$this->em = $em;
$this->projectService = $projectService;
$this->logger = $logger;
}
public static function getSubscribedEvents(): array
{
return [
ProjectPropertiesChangedEvent::class => 'onProjectPropertiesChanged',
];
}
public function onProjectPropertiesChanged(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()) {
// Pas de projets attachés, pas de propagation nécessaire
return;
}
$this->logger->info('Propagation de TOUTES les propriétés modifiées', [
'project_id' => $project->getId(),
'project_name' => $project->getName(),
'changed_properties' => array_keys($changedProperties),
'attached_projects_count' => $attachedProjects->count()
]);
$updatedCount = 0;
foreach ($attachedProjects as $attachedProject) {
$hasChanges = false;
foreach ($changedProperties as $property => $newValue) {
$setter = 'set' . ucfirst($property);
// Vérifier que la méthode setter existe
if (method_exists($attachedProject, $setter)) {
$attachedProject->$setter($newValue);
$hasChanges = true;
$this->logger->debug("Propriété '{$property}' mise à jour", [
'attached_project_id' => $attachedProject->getId(),
'new_value' => $newValue
]);
}
}
if ($hasChanges) {
$updatedCount++;
}
}
if ($updatedCount > 0) {
// Pas besoin de flush ici car c'est déjà fait dans le ProjectService
$this->logger->info("Propagation terminée : {$updatedCount} projets attachés mis à jour avec " . count($changedProperties) . " propriétés");
}
}
}