<?phpnamespace App\EventSubscriber;use App\Controller\Adherent\Validation\AbstractValidationController;use App\Controller\Adherent\Validation\AdditionnalInformationsController;use App\Controller\Adherent\Validation\PaymentController;use App\Entity\Enum\RegistrationStatus;use App\Entity\Registration;use App\Security\Voter\Adherent\RegistrationVoter;use Symfony\Bundle\FrameworkBundle\Controller\RedirectController;use Symfony\Component\EventDispatcher\EventSubscriberInterface;use Symfony\Component\HttpKernel\Event\ControllerArgumentsEvent;use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;use Symfony\Component\Routing\Generator\UrlGeneratorInterface;use Symfony\Component\Security\Core\Security;/** * Injecte l'objet Registration dans AbstractValidationController * Vérifie que l'utilisateur connecté a les droits d'accéder à l'object Registration * Vérifie que l'utilisateur n'essaie pas d'accéder à une étape de validation supérieure à celle disponible */class ValidationControllerSubscriber implements EventSubscriberInterface{ public function __construct(private readonly Security $security, private readonly UrlGeneratorInterface $urlGenerator) { } public function onKernelControllerArguments(ControllerArgumentsEvent $event) { $callable = $event->getController(); if (is_array($callable) && null !== $callable[0] ?? null) { $controller = $callable[0]; if ($controller instanceof AbstractValidationController) { foreach ($event->getArguments() as $argument) { if ($argument instanceof Registration) { $registration = $argument; // Injection de l'objet Registration $controller->setRegistration($registration); // Renvoie une erreur Si l'utilisateur n'a pas les droits d'accès à cette inscription if (false === $this->security->isGranted(RegistrationVoter::EDIT, $registration)) { throw new AccessDeniedHttpException(); } // Redirige l'utilisateur vers la page de récapitulatif de paiement ou de paiement par carte si le statut est en attente de paiement if (!$controller instanceof PaymentController && $registration->getStatus() === RegistrationStatus::Payment) { $event->setController(function () use ($event) { return (new RedirectController($this->urlGenerator)) ->redirectAction($event->getRequest(), 'validation_payment'); }); return; } // Renvoie une erreur 404 si l'inscription n'est pas en statut "affecté non inscrit" if (!$controller instanceof PaymentController && $registration->getStatus() !== RegistrationStatus::Assigned) { throw new NotFoundHttpException(); } // L'utilisateur est redirigé s'il essaie d'accéder à une étape sans avoir sélectionné de cours ou de créneaux if ($controller::$step !== 1 && ($registration->getLesson() === null || $registration->getSlots()->isEmpty())) { $event->setController(function () use ($event) { return (new RedirectController($this->urlGenerator)) ->redirectAction($event->getRequest(), 'validation_lesson'); }); return; } // L'utilisateur est redirigé s'il essaie d'accéder à une étape de validation suppérieure à celle disponible if ($registration->getValidationStep() < $controller::$step) { $event->setController(function () use ($event) { return (new RedirectController($this->urlGenerator)) ->redirectAction($event->getRequest(), 'validation_lesson'); }); return; } // Redirige l'utilisateur vers l'étape 4 si aucun signataire n'est affecté à l'inscription if ($controller::$step > AdditionnalInformationsController::$step && $registration->getSignatory() === null) { $event->setController(function () use ($event) { return (new RedirectController($this->urlGenerator)) ->redirectAction($event->getRequest(), 'validation_approval'); }); return; } } } } } } public static function getSubscribedEvents() { return [ 'kernel.controller_arguments' => 'onKernelControllerArguments', ]; }}