src/EventSubscriber/LeaveCancelViaRequestGuardSubscriber.php line 12

  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\Leave;
  4. use App\Enum\LeaveCancellationRequestStatus;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Symfony\Component\Workflow\Event\GuardEvent;
  7. class LeaveCancelViaRequestGuardSubscriber implements EventSubscriberInterface
  8. {
  9.     public function guardCancelViaRequest(GuardEvent $event): void
  10.     {
  11.         /** @var Leave $leave */
  12.         $leave $event->getSubject();
  13.         $cancellationRequest $leave->getLeaveCancellationRequest();
  14.         $alreadyHasACancellationRequest null !== $cancellationRequest;
  15.         if (!$alreadyHasACancellationRequest) {
  16.             $event->setBlocked(true'No cancellation request exists.');
  17.         } else {
  18.             $cancellationRequestIsAccepted =
  19.                 LeaveCancellationRequestStatus::ACCEPTED->value === $cancellationRequest->getStatus();
  20.             if (!$cancellationRequestIsAccepted) {
  21.                 $event->setBlocked(true'The cancellation request is not accepted.');
  22.             }
  23.         }
  24.     }
  25.     public static function getSubscribedEvents(): array
  26.     {
  27.         $workflowName 'leave';
  28.         $transitionName 'cancel_via_request';
  29.         return [
  30.             'workflow.' $workflowName '.guard.' $transitionName => ['guardCancelViaRequest'],
  31.         ];
  32.     }
  33. }