src/EventSubscriber/MaintenanceSubscriber.php line 35

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\Settings;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Symfony\Component\HttpFoundation\RedirectResponse;
  7. use Symfony\Component\HttpKernel\Event\RequestEvent;
  8. use Symfony\Component\HttpKernel\KernelEvents;
  9. use Symfony\Component\Routing\RouterInterface;
  10. use Symfony\Component\Security\Core\Security;
  11. class MaintenanceSubscriber implements EventSubscriberInterface
  12. {
  13.     private EntityManagerInterface $entityManager;
  14.     private RouterInterface $router;
  15.     private Security $security;
  16.     public function __construct(EntityManagerInterface $entityManagerRouterInterface $routerSecurity $security)
  17.     {
  18.         $this->entityManager $entityManager;
  19.         $this->router $router;
  20.         $this->security $security;
  21.     }
  22.     public static function getSubscribedEvents(): array
  23.     {
  24.         // Die Priorität auf 0 setzen, damit der Subscriber nicht vorzeitig ausgeführt wird
  25.         return [
  26.             KernelEvents::REQUEST => ['onKernelRequest'0],
  27.         ];
  28.     }
  29.     public function onKernelRequest(RequestEvent $event)
  30.     {
  31.         $request $event->getRequest();
  32.         $route $request->get('_route');
  33.     
  34.         // Lade die Einstellungen aus der Datenbank
  35.         $settings $this->entityManager->getRepository(Settings::class)->find(1);
  36.     
  37.         // Wenn der Wartungsmodus nicht aktiviert ist, keine Weiterleitung
  38.         if (!$settings || !$settings->isMaintenanceMode()) {
  39.             return;
  40.         }
  41.     
  42.         // Wenn der Benutzer ein Admin ist oder eingeloggt ist, keine Weiterleitung
  43.         if ($this->security->isGranted('ROLE_ADMIN') || $this->security->isGranted('IS_AUTHENTICATED_FULLY')) {
  44.             return;
  45.         }
  46.     
  47.         // Profiler & Debug-Routen nicht weiterleiten (damit der Symfony Profiler erreichbar bleibt)
  48.         if (preg_match('/^(_profiler|_wdt)/'$route)) {
  49.             return;
  50.         }
  51.     
  52.         // Login-Route nicht weiterleiten, damit sich Admins anmelden können
  53.         if ($route === 'app_login') {
  54.             return;
  55.         }
  56.     
  57.         // Prüfe, ob die Route die Wartungsseite selbst ist, wenn ja, keine Weiterleitung
  58.         if ($route === 'maintenance') {
  59.             return;
  60.         }
  61.     
  62.         // Leite auf die Wartungsseite weiter, wenn keine der obigen Bedingungen zutrifft
  63.         $event->setResponse(new RedirectResponse($this->router->generate('maintenance')));
  64.     }
  65.     
  66. }