vendor/store.shopware.com/viorepresentativelogin/src/Storefront/Subscriber/StorefrontSubscriber.php line 115

Open in your IDE?
  1. <?php /** @noinspection PhpMultipleClassDeclarationsInspection */
  2. declare(strict_types=1);
  3. namespace VioRepresentativeLogin\Storefront\Subscriber;
  4. use JsonException;
  5. use Shopware\Core\Framework\Routing\Annotation\LoginRequired;
  6. use Shopware\Core\Framework\Routing\KernelListenerPriorities;
  7. use Shopware\Core\Framework\Util\Random;
  8. use Shopware\Core\PlatformRequest;
  9. use Shopware\Core\SalesChannelRequest;
  10. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  11. use Shopware\Core\System\SystemConfig\SystemConfigService;
  12. use Shopware\Storefront\Controller\AccountProfileController;
  13. use Shopware\Storefront\Framework\Routing\StorefrontSubscriber as CoreStorefrontSubscriber;
  14. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  15. use Symfony\Component\HttpFoundation\RedirectResponse;
  16. use Symfony\Component\HttpKernel\Event\ControllerEvent;
  17. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  18. use Symfony\Component\HttpKernel\KernelEvents;
  19. use Symfony\Component\Routing\RouterInterface;
  20. use VioRepresentativeLogin\Core\Checkout\Customer\Event\AgentCustomerLogoutEvent;
  21. use VioRepresentativeLogin\Core\Checkout\Customer\Event\AgentLoginEvent;
  22. use VioRepresentativeLogin\Core\Checkout\Customer\Event\AgentLogoutEvent;
  23. use VioRepresentativeLogin\Core\Exception\AgentNotLoggedInException;
  24. use VioRepresentativeLogin\Core\Framework\Routing\Annotation\RepresentativeLoginRequired;
  25. use VioRepresentativeLogin\Core\System\SalesChannel\Context\SalesChannelContextFactory;
  26. use VioRepresentativeLogin\Entity\Agent\AgentEntity;
  27. class StorefrontSubscriber implements EventSubscriberInterface
  28. {
  29.     private RouterInterface $router;
  30.     private CoreStorefrontSubscriber $storefrontSubscriber;
  31.     private SystemConfigService $systemConfigService;
  32.     public function __construct(
  33.         RouterInterface          $router,
  34.         CoreStorefrontSubscriber $storefrontSubscriber,
  35.         SystemConfigService      $systemConfigService
  36.     )
  37.     {
  38.         $this->router $router;
  39.         $this->storefrontSubscriber $storefrontSubscriber;
  40.         $this->systemConfigService $systemConfigService;
  41.     }
  42.     public static function getSubscribedEvents(): array
  43.     {
  44.         return [
  45.             KernelEvents::EXCEPTION => 'agentNotLoggedInHandler',
  46.             AgentLoginEvent::class => 'updateSessionAfterLogin',
  47.             AgentLogoutEvent::class => 'updateSessionAfterLogout',
  48.             AgentCustomerLogoutEvent::class => 'updateSessionAfterCustomerLogout',
  49.             KernelEvents::CONTROLLER => [
  50.                 ['onKernelControllerPreContextResolve'KernelListenerPriorities::KERNEL_CONTROLLER_EVENT_CONTEXT_RESOLVE_PRE],
  51.                 ['onKernelControllerPostContextResolve'KernelListenerPriorities::KERNEL_CONTROLLER_EVENT_CONTEXT_RESOLVE_POST]
  52.             ],
  53.         ];
  54.     }
  55.     public function onKernelControllerPostContextResolve(ControllerEvent $event): void
  56.     {
  57.         $request $event->getRequest();
  58.         if ($request->attributes->has(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_CONTEXT_OBJECT)
  59.             && strpos($request->attributes->get('_route'), 'frontend.account') === 0) {
  60.             /** @var AccountProfileController $controller */
  61.             $controller $event->getController();
  62.             /** @var SalesChannelContext $salesChannelContext */
  63.             $salesChannelContext $request->attributes->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_CONTEXT_OBJECT);
  64.             if ($controller
  65.                 && $salesChannelContext->getCustomer() === null
  66.                 && $salesChannelContext->getExtensionOfType(SalesChannelContextFactory::AGENT_KEYAgentEntity::class) !== null) {
  67.                 // redirect to different Route
  68.                 $event->setController(function () use ($salesChannelContext) {
  69.                     return new RedirectResponse($this->router->generate($this->getRedirectRoute($salesChannelContext)));
  70.                 });
  71.             }
  72.         }
  73.     }
  74.     public function onKernelControllerPreContextResolve(ControllerEvent $event): void
  75.     {
  76.         $request $event->getRequest();
  77.         if ($request->attributes->has(PlatformRequest::ATTRIBUTE_LOGIN_REQUIRED)) {
  78.             // decorate class
  79.             /** @var LoginRequired $loginRequiredAnnotation */
  80.             $loginRequiredAnnotation $request->attributes->get(PlatformRequest::ATTRIBUTE_LOGIN_REQUIRED);
  81.             if( $loginRequiredAnnotation instanceof LoginRequired ) {
  82.                 $loginRequiredAnnotationAllowGuests $loginRequiredAnnotation->isAllowGuest();
  83.             }
  84.             else {
  85.                 $loginRequiredAnnotationAllowGuests $request->attributes->get(PlatformRequest::ATTRIBUTE_LOGIN_REQUIRED_ALLOW_GUEST);
  86.             }
  87.             $RepresentativeLoginRequired = new RepresentativeLoginRequired(['allowGuest' => $loginRequiredAnnotationAllowGuests]);
  88.             $request->attributes->set(PlatformRequest::ATTRIBUTE_LOGIN_REQUIRED$RepresentativeLoginRequired);
  89.         }
  90.     }
  91.     public function updateSessionAfterCustomerLogout(AgentCustomerLogoutEvent $event): void
  92.     {
  93.         $token $event->getSalesChannelContext()->getToken();
  94.         $this->storefrontSubscriber->updateSession($token);
  95.     }
  96.     public function updateSessionAfterLogin(AgentLoginEvent $event): void
  97.     {
  98.         $token $event->getContextToken();
  99.         $this->storefrontSubscriber->updateSession($token);
  100.     }
  101.     public function updateSessionAfterLogout(): void
  102.     {
  103.         $newToken Random::getAlphanumericString(32);
  104.         $this->storefrontSubscriber->updateSession($newTokentrue);
  105.     }
  106.     /**
  107.      * @throws JsonException
  108.      */
  109.     public function agentNotLoggedInHandler(ExceptionEvent $event): void
  110.     {
  111.         if (!$event->getRequest()->attributes->has(SalesChannelRequest::ATTRIBUTE_IS_SALES_CHANNEL_REQUEST)) {
  112.             return;
  113.         }
  114.         if (!$event->getThrowable() instanceof AgentNotLoggedInException) {
  115.             return;
  116.         }
  117.         $request $event->getRequest();
  118.         /** @noinspection PhpComposerExtensionStubsInspection */
  119.         $parameters = [
  120.             'redirectTo' => $request->attributes->get('_route'),
  121.             'redirectParameters' => json_encode($request->attributes->get('_route_params'), JSON_THROW_ON_ERROR),
  122.         ];
  123.         $redirectResponse = new RedirectResponse($this->router->generate('frontend.account.login.page'$parameters));
  124.         $event->setResponse($redirectResponse);
  125.     }
  126.     private function getRedirectRoute(SalesChannelContext $salesChannelContext): string
  127.     {
  128.         $redirectToCustomerList = (bool)$this->systemConfigService->get('VioRepresentativeLogin.config.redirectToCustomerList'$salesChannelContext->getSalesChannel()->getId());
  129.         if ($redirectToCustomerList) {
  130.             return 'frontend.representative.customer.list.page';
  131.         }
  132.         return 'frontend.representative.agent.home.page';
  133.     }
  134. }