src/EventSubscriber/MaintenanceSubscriber.php line 23

  1. <?php
  2. namespace Cms\EventSubscriber;
  3. use Cms\String\MaintenanceTokenChecker;
  4. use Symfony\Component\DependencyInjection\Attribute\Autowire;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Symfony\Component\HttpFoundation\RequestStack;
  7. use Symfony\Component\HttpFoundation\Response;
  8. use Symfony\Component\HttpKernel\Event\RequestEvent;
  9. use Symfony\Component\HttpKernel\KernelEvents;
  10. use Twig\Environment;
  11. class MaintenanceSubscriber implements EventSubscriberInterface
  12. {
  13.     public function __construct(
  14.         private readonly Environment $twig,
  15.         private readonly RequestStack $requestStack,
  16.         #[Autowire('%cms.is_maintenance%')] private readonly bool $isMaintenance,
  17.         #[Autowire('%cms.is_maintenance.token%')] private readonly string $maintenanceToken,
  18.     ) {}
  19.     public function onKernelRequest(RequestEvent $event): void
  20.     {
  21.         $request $event->getRequest();
  22.         $token $request->query->get('token'null);
  23.         if (
  24.             $this->isMaintenance
  25.             && (!$token || $this->maintenanceToken !== $token)
  26.             && !\str_starts_with($request->attributes->get('_route'), '_')
  27.             ) {
  28.             $response = new Response();
  29.             if ($this->requestStack->getMainRequest() === $request) {
  30.                 $response->setContent($this->twig->render('maintenance.html.twig'));
  31.             }
  32.             $event->setResponse($response);
  33.         }
  34.     }
  35.     public static function getSubscribedEvents(): array
  36.     {
  37.         return [
  38.             KernelEvents::REQUEST => ['onKernelRequest'0],
  39.         ];
  40.     }
  41. }