src/EventSubscriber/ValidationControllerSubscriber.php line 30

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Controller\Adherent\Validation\AbstractValidationController;
  4. use App\Controller\Adherent\Validation\AdditionnalInformationsController;
  5. use App\Controller\Adherent\Validation\PaymentController;
  6. use App\Entity\Enum\RegistrationStatus;
  7. use App\Entity\Registration;
  8. use App\Security\Voter\Adherent\RegistrationVoter;
  9. use Symfony\Bundle\FrameworkBundle\Controller\RedirectController;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. use Symfony\Component\HttpKernel\Event\ControllerArgumentsEvent;
  12. use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  13. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  14. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  15. use Symfony\Component\Security\Core\Security;
  16. /**
  17.  * Injecte l'objet Registration dans AbstractValidationController
  18.  * Vérifie que l'utilisateur connecté a les droits d'accéder à l'object Registration
  19.  * Vérifie que l'utilisateur n'essaie pas d'accéder à une étape de validation supérieure à celle disponible
  20.  */
  21. class ValidationControllerSubscriber implements EventSubscriberInterface
  22. {
  23.     public function __construct(private readonly Security $security, private readonly UrlGeneratorInterface $urlGenerator)
  24.     {
  25.     }
  26.     public function onKernelControllerArguments(ControllerArgumentsEvent $event)
  27.     {
  28.         $callable $event->getController();
  29.         if (is_array($callable) && null !== $callable[0] ?? null) {
  30.             $controller $callable[0];
  31.             if ($controller instanceof AbstractValidationController) {
  32.                 foreach ($event->getArguments() as $argument) {
  33.                     if ($argument instanceof Registration) {
  34.                         $registration $argument;
  35.                         // Injection de l'objet Registration
  36.                         $controller->setRegistration($registration);
  37.                         // Renvoie une erreur Si l'utilisateur n'a pas les droits d'accès à cette inscription
  38.                         if (false === $this->security->isGranted(RegistrationVoter::EDIT$registration)) {
  39.                             throw new AccessDeniedHttpException();
  40.                         }
  41.                         // Redirige l'utilisateur vers la page de récapitulatif de paiement ou de paiement par carte si le statut est en attente de paiement
  42.                         if (!$controller instanceof PaymentController &&
  43.                             $registration->getStatus() === RegistrationStatus::Payment) {
  44.                             $event->setController(function () use ($event) {
  45.                                 return (new RedirectController($this->urlGenerator))
  46.                                     ->redirectAction($event->getRequest(), 'validation_payment');
  47.                             });
  48.                             return;
  49.                         }
  50.                         // Renvoie une erreur 404 si l'inscription n'est pas en statut "affecté non inscrit"
  51.                         if (!$controller instanceof PaymentController &&
  52.                             $registration->getStatus() !== RegistrationStatus::Assigned) {
  53.                             throw new NotFoundHttpException();
  54.                         }
  55.                         // L'utilisateur est redirigé s'il essaie d'accéder à une étape sans avoir sélectionné de cours ou de créneaux
  56.                         if ($controller::$step !== 1
  57.                             && ($registration->getLesson() === null || $registration->getSlots()->isEmpty())) {
  58.                             $event->setController(function () use ($event) {
  59.                                 return (new RedirectController($this->urlGenerator))
  60.                                     ->redirectAction($event->getRequest(), 'validation_lesson');
  61.                             });
  62.                             return;
  63.                         }
  64.                         // L'utilisateur est redirigé s'il essaie d'accéder à une étape de validation suppérieure à celle disponible
  65.                         if ($registration->getValidationStep() < $controller::$step) {
  66.                             $event->setController(function () use ($event) {
  67.                                 return (new RedirectController($this->urlGenerator))
  68.                                     ->redirectAction($event->getRequest(), 'validation_lesson');
  69.                             });
  70.                             return;
  71.                         }
  72.                         // Redirige l'utilisateur vers l'étape 4 si aucun signataire n'est affecté à l'inscription
  73.                         if ($controller::$step AdditionnalInformationsController::$step &&
  74.                             $registration->getSignatory() === null) {
  75.                             $event->setController(function () use ($event) {
  76.                                 return (new RedirectController($this->urlGenerator))
  77.                                     ->redirectAction($event->getRequest(), 'validation_approval');
  78.                             });
  79.                             return;
  80.                         }
  81.                     }
  82.                 }
  83.             }
  84.         }
  85.     }
  86.     public static function getSubscribedEvents()
  87.     {
  88.         return [
  89.             'kernel.controller_arguments' => 'onKernelControllerArguments',
  90.         ];
  91.     }
  92. }