custom/plugins/SwagB2bPlatform/SwagB2bPlatform/Routing/ControllerRoutingExceptionHandler.php line 58

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace SwagB2bPlatform\Routing;
  3. use LogicException;
  4. use Shopware\B2B\Common\Controller\B2bControllerForwardException;
  5. use Shopware\B2B\Common\Controller\B2bControllerRedirectException;
  6. use Shopware\B2B\Common\Controller\B2bControllerRouteNameProvider;
  7. use Shopware\B2B\Common\Controller\B2bControllerRoutingException;
  8. use Shopware\Core\Framework\Routing\RequestTransformerInterface;
  9. use Shopware\Storefront\Framework\Routing\Router;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. use Symfony\Component\HttpFoundation\RedirectResponse;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  15. use Symfony\Component\HttpKernel\HttpKernelInterface;
  16. use Symfony\Component\HttpKernel\KernelEvents;
  17. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  18. use Symfony\Component\Routing\RouterInterface;
  19. use function array_merge;
  20. use function get_class;
  21. class ControllerRoutingExceptionHandler implements EventSubscriberInterface
  22. {
  23.     /**
  24.      * @var RouterInterface
  25.      */
  26.     private $router;
  27.     /**
  28.      * @var HttpKernelInterface
  29.      */
  30.     private $httpKernel;
  31.     /**
  32.      * @var RequestTransformerInterface
  33.      */
  34.     private $requestTransformer;
  35.     public function __construct(
  36.         RouterInterface $router,
  37.         HttpKernelInterface $httpKernel,
  38.         RequestTransformerInterface $requestTransformer
  39.     ) {
  40.         $this->router $router;
  41.         $this->httpKernel $httpKernel;
  42.         $this->requestTransformer $requestTransformer;
  43.     }
  44.     public static function getSubscribedEvents(): array
  45.     {
  46.         return [
  47.             KernelEvents::EXCEPTION => ['handleRouting'500],
  48.         ];
  49.     }
  50.     public function handleRouting(ExceptionEvent $event): void
  51.     {
  52.         $exception $event->getThrowable();
  53.         $request $event->getRequest();
  54.         if (!$exception instanceof B2bControllerRoutingException) {
  55.             return;
  56.         }
  57.         if ($exception instanceof B2bControllerForwardException) {
  58.             $this->updateEvent($event$this->handleForward($exception$request));
  59.             return;
  60.         }
  61.         if ($exception instanceof B2bControllerRedirectException) {
  62.             $this->updateEvent($event$this->handleRedirect($exception$request));
  63.             return;
  64.         }
  65.         throw new LogicException('Unable to handle ' get_class($exception));
  66.     }
  67.     /**
  68.      * @internal
  69.      */
  70.     protected function updateEvent(ExceptionEvent $eventResponse $response): void
  71.     {
  72.         $event->allowCustomResponseCode();
  73.         $event->setResponse($response);
  74.         $event->stopPropagation();
  75.     }
  76.     /**
  77.      * @internal
  78.      */
  79.     protected function handleRedirect(B2bControllerRedirectException $redirectExceptionRequest $request): Response
  80.     {
  81.         $url $this->generateUrl($redirectException$request);
  82.         return new RedirectResponse($url);
  83.     }
  84.     /**
  85.      * @internal
  86.      */
  87.     protected function handleForward(B2bControllerForwardException $forwardExceptionRequest $request): Response
  88.     {
  89.         $route $this->assembleRouteName($forwardException$request);
  90.         $url $this->router
  91.             ->generate($route, [], Router::PATH_INFO);
  92.         $subRequest $this->cloneRequest($forwardException$request$url);
  93.         return $this->httpKernel->handle($subRequestHttpKernelInterface::SUB_REQUEST);
  94.     }
  95.     /**
  96.      * @internal
  97.      */
  98.     protected function assembleRouteName(B2bControllerRoutingException $routingExceptionRequest $request): string
  99.     {
  100.         if ($routingException instanceof B2bControllerRouteNameProvider) {
  101.             return $routingException->getRouteName();
  102.         }
  103.         $controller $routingException->getController();
  104.         if ($controller === null) {
  105.             $routeParams $request->attributes->get('_route_params');
  106.             $controller $routeParams[RouteLoader::ROUTE_CONTROLLER_ROUTE_NAME];
  107.         }
  108.         $action $routingException->getAction();
  109.         return 'frontend.b2b.' $controller '.' $action;
  110.     }
  111.     /**
  112.      * @internal
  113.      */
  114.     protected function cloneRequest(B2bControllerForwardException $forwardExceptionRequest $requeststring $url): Request
  115.     {
  116.         $requestContext $this->router
  117.             ->getContext();
  118.         $currentMethod $requestContext
  119.             ->getMethod();
  120.         $requestContext
  121.             ->setMethod(Request::METHOD_GET);
  122.         $route $this->router->match($url);
  123.         $requestContext->setMethod($currentMethod);
  124.         $route['_route_params'] = $route;
  125.         $route array_merge(
  126.             $this->requestTransformer->extractInheritableAttributes($request),
  127.             $route
  128.         );
  129.         return $request->duplicate($forwardException->getParams(), null$route);
  130.     }
  131.     /**
  132.      * @internal
  133.      */
  134.     protected function generateUrl(B2bControllerRoutingException $eRequest $request): string
  135.     {
  136.         $route $this->assembleRouteName($e$request);
  137.         return $this->router
  138.             ->generate($route$e->getParams(), UrlGeneratorInterface::ABSOLUTE_PATH);
  139.     }
  140. }