<?php
namespace App\EventSubscriber;
use App\Entity\Settings;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Security;
class MaintenanceSubscriber implements EventSubscriberInterface
{
private EntityManagerInterface $entityManager;
private RouterInterface $router;
private Security $security;
public function __construct(EntityManagerInterface $entityManager, RouterInterface $router, Security $security)
{
$this->entityManager = $entityManager;
$this->router = $router;
$this->security = $security;
}
public static function getSubscribedEvents(): array
{
// Die Priorität auf 0 setzen, damit der Subscriber nicht vorzeitig ausgeführt wird
return [
KernelEvents::REQUEST => ['onKernelRequest', 0],
];
}
public function onKernelRequest(RequestEvent $event)
{
$request = $event->getRequest();
$route = $request->get('_route');
// Lade die Einstellungen aus der Datenbank
$settings = $this->entityManager->getRepository(Settings::class)->find(1);
// Wenn der Wartungsmodus nicht aktiviert ist, keine Weiterleitung
if (!$settings || !$settings->isMaintenanceMode()) {
return;
}
// Wenn der Benutzer ein Admin ist oder eingeloggt ist, keine Weiterleitung
if ($this->security->isGranted('ROLE_ADMIN') || $this->security->isGranted('IS_AUTHENTICATED_FULLY')) {
return;
}
// Profiler & Debug-Routen nicht weiterleiten (damit der Symfony Profiler erreichbar bleibt)
if (preg_match('/^(_profiler|_wdt)/', $route)) {
return;
}
// Login-Route nicht weiterleiten, damit sich Admins anmelden können
if ($route === 'app_login') {
return;
}
// Prüfe, ob die Route die Wartungsseite selbst ist, wenn ja, keine Weiterleitung
if ($route === 'maintenance') {
return;
}
// Leite auf die Wartungsseite weiter, wenn keine der obigen Bedingungen zutrifft
$event->setResponse(new RedirectResponse($this->router->generate('maintenance')));
}
}