src/EventListener/AccessDeniedListener.php line 51

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file has been created by developers from BitBag.
  4.  * Feel free to contact us once you face any issues or want to start
  5.  * You can find more information about us on https://bitbag.io and write us
  6.  * an email on hello@bitbag.io.
  7.  */
  8. declare(strict_types=1);
  9. namespace BitBag\OpenMarketplace\EventListener;
  10. use BitBag\OpenMarketplace\Exception\ShopUserHasNoVendorContextException;
  11. use BitBag\OpenMarketplace\Exception\ShopUserNotFoundException;
  12. use BitBag\OpenMarketplace\Provider\VendorProviderInterface;
  13. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  14. use Symfony\Component\HttpFoundation\RedirectResponse;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\HttpFoundation\RequestStack;
  17. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  18. use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  19. use Symfony\Component\HttpKernel\KernelEvents;
  20. use Symfony\Component\Routing\RouterInterface;
  21. class AccessDeniedListener implements EventSubscriberInterface
  22. {
  23.     private VendorProviderInterface $vendorProvider;
  24.     private RequestStack $requestStack;
  25.     private RouterInterface $router;
  26.     public function __construct(
  27.         VendorProviderInterface $vendorProvider,
  28.         RequestStack $requestStack,
  29.         RouterInterface $router
  30.     ) {
  31.         $this->vendorProvider $vendorProvider;
  32.         $this->requestStack $requestStack;
  33.         $this->router $router;
  34.     }
  35.     public static function getSubscribedEvents(): array
  36.     {
  37.         return [
  38.             KernelEvents::EXCEPTION => ['onKernelException'2],
  39.         ];
  40.     }
  41.     public function onKernelException(ExceptionEvent $event): void
  42.     {
  43.         $exception $event->getThrowable();
  44.         if (!$exception instanceof AccessDeniedHttpException) {
  45.             return;
  46.         }
  47.         /** @var Request $currentRequest */
  48.         $currentRequest $this->requestStack->getCurrentRequest();
  49.         $uriParts explode('/'$currentRequest->getRequestUri());
  50.         if ('' === $uriParts[0]) {
  51.             array_shift($uriParts);
  52.         }
  53.         if (count($uriParts)) {
  54.             return;
  55.         }
  56.         if ('account' !== $uriParts[1] || 'vendor' !== $uriParts[2] || 'conversations' === $uriParts[3]) {
  57.             return;
  58.         }
  59.         try {
  60.             $currentVendor $this->vendorProvider->provideCurrentVendor();
  61.             if (false === $currentVendor->isEnabled()) {
  62.                 $event->setResponse(new RedirectResponse(
  63.                     $this->router->generate('open_marketplace_vendor_conversation_index')
  64.                 ));
  65.                 $event->stopPropagation();
  66.             }
  67.         } catch (ShopUserHasNoVendorContextException|ShopUserNotFoundException $e) {
  68.         }
  69.     }
  70. }