vendor/nedac/sylius-minimum-order-value-plugin/src/Checkout/CheckoutResolver.php line 38

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Nedac\SyliusMinimumOrderValuePlugin\Checkout;
  4. use SM\Factory\FactoryInterface;
  5. use Sylius\Bundle\CoreBundle\Checkout\CheckoutStateUrlGeneratorInterface;
  6. use Sylius\Component\Core\Model\OrderInterface;
  7. use Sylius\Component\Core\OrderCheckoutTransitions;
  8. use Sylius\Component\Order\Context\CartContextInterface;
  9. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  10. use Symfony\Component\HttpFoundation\RedirectResponse;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpFoundation\RequestMatcherInterface;
  13. use Symfony\Component\HttpKernel\Event\RequestEvent;
  14. use Symfony\Component\HttpKernel\KernelEvents;
  15. final class CheckoutResolver implements EventSubscriberInterface
  16. {
  17.     private CartContextInterface $cartContext;
  18.     private CheckoutStateUrlGeneratorInterface $urlGenerator;
  19.     private RequestMatcherInterface $requestMatcher;
  20.     private FactoryInterface $stateMachineFactory;
  21.     public function __construct(
  22.         CartContextInterface $cartContext,
  23.         CheckoutStateUrlGeneratorInterface $urlGenerator,
  24.         RequestMatcherInterface $requestMatcher,
  25.         FactoryInterface $stateMachineFactory
  26.     ) {
  27.         $this->cartContext $cartContext;
  28.         $this->urlGenerator $urlGenerator;
  29.         $this->requestMatcher $requestMatcher;
  30.         $this->stateMachineFactory $stateMachineFactory;
  31.     }
  32.     public function onKernelRequest(RequestEvent $event): void
  33.     {
  34.         if (!$event->isMasterRequest()) {
  35.             return;
  36.         }
  37.         $request $event->getRequest();
  38.         if (!$this->requestMatcher->matches($request)) {
  39.             return;
  40.         }
  41.         /** @var OrderInterface $order */
  42.         $order $this->cartContext->getCart();
  43.         if ($order->isEmpty()) {
  44.             $event->setResponse(new RedirectResponse($this->urlGenerator->generateForCart()));
  45.         }
  46.         $transition $this->getRequestedTransition($request);
  47.         $stateMachine $this->stateMachineFactory->get($order$this->getRequestedGraph($request));
  48.         if ($stateMachine->can($transition)) {
  49.             return;
  50.         }
  51.         if (OrderCheckoutTransitions::TRANSITION_ADDRESS === $transition) {
  52.             $event->setResponse(new RedirectResponse($this->urlGenerator->generateForCart()));
  53.             return;
  54.         }
  55.         $event->setResponse(new RedirectResponse($this->urlGenerator->generateForOrderCheckoutState($order)));
  56.     }
  57.     /**
  58.      * @return array<string, string>
  59.      */
  60.     public static function getSubscribedEvents(): array
  61.     {
  62.         return [
  63.             KernelEvents::REQUEST => 'onKernelRequest',
  64.         ];
  65.     }
  66.     private function getRequestedGraph(Request $request): string
  67.     {
  68.         return $request->attributes->get('_sylius')['state_machine']['graph'];
  69.     }
  70.     private function getRequestedTransition(Request $request): string
  71.     {
  72.         return $request->attributes->get('_sylius')['state_machine']['transition'];
  73.     }
  74. }