vendor/shopware/storefront/Controller/MaintenanceController.php line 73

  1. <?php declare(strict_types=1);
  2. namespace Shopware\Storefront\Controller;
  3. use Shopware\Core\Framework\Adapter\Kernel\HttpCacheKernel;
  4. use Shopware\Core\Framework\Log\Package;
  5. use Shopware\Core\Framework\Routing\RoutingException;
  6. use Shopware\Core\SalesChannelRequest;
  7. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  8. use Shopware\Core\System\SystemConfig\SystemConfigService;
  9. use Shopware\Storefront\Framework\Routing\MaintenanceModeResolver;
  10. use Shopware\Storefront\Page\Maintenance\MaintenancePageLoadedHook;
  11. use Shopware\Storefront\Page\Maintenance\MaintenancePageLoader;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. /**
  16.  * @internal
  17.  * Do not use direct or indirect repository calls in a controller. Always use a store-api route to get or put data
  18.  */
  19. #[Route(defaults: ['_routeScope' => ['storefront']])]
  20. #[Package('storefront')]
  21. class MaintenanceController extends StorefrontController
  22. {
  23.     /**
  24.      * @internal
  25.      */
  26.     public function __construct(
  27.         private readonly SystemConfigService $systemConfigService,
  28.         private readonly MaintenancePageLoader $maintenancePageLoader,
  29.         private readonly MaintenanceModeResolver $maintenanceModeResolver
  30.     ) {
  31.     }
  32.     #[Route(path'/maintenance'name'frontend.maintenance.page'defaults: ['allow_maintenance' => true'_httpCache' => true], methods: ['GET'])]
  33.     public function renderMaintenancePage(Request $requestSalesChannelContext $context): ?Response
  34.     {
  35.         $salesChannel $context->getSalesChannel();
  36.         if ($this->maintenanceModeResolver->shouldRedirectToShop($request)) {
  37.             return $this->redirectToRoute('frontend.home.page');
  38.         }
  39.         $salesChannelId $salesChannel->getId();
  40.         $maintenanceLayoutId $this->systemConfigService->getString('core.basicInformation.maintenancePage'$salesChannelId);
  41.         if ($maintenanceLayoutId === '') {
  42.             $response $this->renderStorefront(
  43.                 '@Storefront/storefront/page/error/error-maintenance.html.twig'
  44.             );
  45.             $response->setStatusCode(Response::HTTP_SERVICE_UNAVAILABLE'Service Temporarily Unavailable');
  46.             $response->headers->set('Retry-After''3600');
  47.             $this->addWhitelistIpHeader($request$response);
  48.             return $response;
  49.         }
  50.         $maintenancePage $this->maintenancePageLoader->load($maintenanceLayoutId$request$context);
  51.         $this->hook(new MaintenancePageLoadedHook($maintenancePage$context));
  52.         $response $this->renderStorefront(
  53.             '@Storefront/storefront/page/error/error-maintenance.html.twig',
  54.             ['page' => $maintenancePage]
  55.         );
  56.         $response->setStatusCode(Response::HTTP_SERVICE_UNAVAILABLE'Service Temporarily Unavailable');
  57.         $response->headers->set('Retry-After''3600');
  58.         $this->addWhitelistIpHeader($request$response);
  59.         return $response;
  60.     }
  61.     /**
  62.      * Route for stand alone cms pages during maintenance
  63.      */
  64.     #[Route(path'/maintenance/singlepage/{id}'name'frontend.maintenance.singlepage'defaults: ['allow_maintenance' => true'_httpCache' => true], methods: ['GET'])]
  65.     public function renderSinglePage(string $idRequest $requestSalesChannelContext $salesChannelContext): Response
  66.     {
  67.         if (!$id) {
  68.             throw RoutingException::missingRequestParameter('id');
  69.         }
  70.         $cmsPage $this->maintenancePageLoader->load($id$request$salesChannelContext);
  71.         $this->hook(new MaintenancePageLoadedHook($cmsPage$salesChannelContext));
  72.         $response $this->renderStorefront(
  73.             '@Storefront/storefront/page/content/single-cms-page.html.twig',
  74.             ['page' => $cmsPage]
  75.         );
  76.         $this->addWhitelistIpHeader($request$response);
  77.         return $response;
  78.     }
  79.     private function addWhitelistIpHeader(Request $requestResponse $response): void
  80.     {
  81.         if ($ips $request->attributes->get(SalesChannelRequest::ATTRIBUTE_SALES_CHANNEL_MAINTENANCE_IP_WHITLELIST)) {
  82.             $ips implode(','json_decode($ipstrueflags\JSON_THROW_ON_ERROR));
  83.             $response->headers->set(HttpCacheKernel::MAINTENANCE_WHITELIST_HEADER$ips);
  84.         }
  85.     }
  86. }