src/Component/Core/Vendor/EventListener/AccessDeniedListener.php line 42

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\Component\Core\Vendor\EventListener;
  10. use BitBag\OpenMarketplace\Component\Core\Vendor\Exception\OrganizationHasNoVendorContextException;
  11. use BitBag\OpenMarketplace\Component\Core\Vendor\Exception\ShopUserNotFoundException;
  12. use BitBag\OpenMarketplace\Component\Vendor\VendorContextInterface;
  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.     public function __construct(
  24.         private VendorContextInterface $vendorProvider,
  25.         private RequestStack $requestStack,
  26.         private RouterInterface $router
  27.     ) {
  28.     }
  29.     public static function getSubscribedEvents(): array
  30.     {
  31.         return [
  32.             KernelEvents::EXCEPTION => ['onKernelException'2],
  33.         ];
  34.     }
  35.     public function onKernelException(ExceptionEvent $event): void
  36.     {
  37.         $exception $event->getThrowable();
  38.         if (!$exception instanceof AccessDeniedHttpException) {
  39.             return;
  40.         }
  41.         /** @var Request $currentRequest */
  42.         $currentRequest $this->requestStack->getCurrentRequest();
  43.         $uriParts explode('/'$currentRequest->getRequestUri());
  44.         if ('' === $uriParts[0]) {
  45.             array_shift($uriParts);
  46.         }
  47.         if (count($uriParts)) {
  48.             return;
  49.         }
  50.         if ('account' !== $uriParts[1] || 'vendor' !== $uriParts[2] || 'conversations' === $uriParts[3]) {
  51.             return;
  52.         }
  53.         try {
  54.             $currentVendor $this->vendorProvider->getVendor();
  55.             if (false === $currentVendor->isEnabled()) {
  56.                 $event->setResponse(new RedirectResponse(
  57.                     $this->router->generate('open_marketplace_vendor_messaging_conversation_index')
  58.                 ));
  59.                 $event->stopPropagation();
  60.             }
  61.         } catch (OrganizationHasNoVendorContextException|ShopUserNotFoundException $e) {
  62.         }
  63.     }
  64. }