<?php
namespace App\EventSubscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Twig\Environment;
use Twig\Error\LoaderError;
use Twig\Error\RuntimeError;
use Twig\Error\SyntaxError;
/**
*
*/
class MaintenanceSubscriber implements EventSubscriberInterface
{
/**
* @var Environment
*/
private $twig;
/**
* @param Environment $twig
*/
public function __construct(Environment $twig)
{
$this->twig = $twig;
}
/**
* @param RequestEvent $event
*
* @return void
* @throws LoaderError
* @throws RuntimeError
* @throws SyntaxError
*/
public function onKernelRequest(RequestEvent $event): void
{
$maintenanceRawValue = $_ENV['MAINTENANCE_MODE'] ?? 0;
if (!filter_var($maintenanceRawValue, FILTER_VALIDATE_BOOLEAN)) {
return;
}
$myIp = $_SERVER['REMOTE_ADDR'];
$exclusionList = [];
$maintenanceRawExclusion = $_ENV['MAINTENANCE_EXCLUSION'] ?? null;
if ($maintenanceRawExclusion) {
$exclusionList = array_map('trim', explode(',', $maintenanceRawExclusion));
}
if (in_array($myIp, $exclusionList)) {
return;
}
$content = $this->twig->render('default/maintenance.html.twig', [
'ip' => $myIp,
]
);
$response = new response($content, Response::HTTP_SERVICE_UNAVAILABLE);
$event->setResponse($response);
$event->stopPropagation();
}
/**
* Returns an array of event names this subscriber wants to listen to.
*
* The array keys are event names and the value can be:
*
* * The method name to call (priority defaults to 0)
* * An array composed of the method name to call and the priority
* * An array of arrays composed of the method names to call and respective
* priorities, or 0 if unset
*
* For instance:
*
* * ['eventName' => 'methodName']
* * ['eventName' => ['methodName', $priority]]
* * ['eventName' => [['methodName1', $priority], ['methodName2']]]
*
* The code must not depend on runtime state as it will only be called at compile time.
* All logic depending on runtime state must be put into the individual methods handling the events.
*
* @return array<string, string|array{0: string, 1: int}|list<array{0: string, 1?: int}>>
*/
public static function getSubscribedEvents(): array
{
return [
'kernel.request' => 'onKernelRequest',
];
}
}