<?php
/******************************************************************************
* Copyright (c) Echo-numeric 2020-2023. *
******************************************************************************/
namespace App\Listener;
use App\Services\Common\PlatformService;
use Exception;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Twig\Environment;
use Twig\Error\LoaderError;
use Twig\Error\RuntimeError;
use Twig\Error\SyntaxError;
class MaintenanceListener
{
private Environment $twig;
private PlatformService $platformService;
public function __construct(
Environment $twig,
PlatformService $platformService
)
{
$this->twig = $twig;
$this->platformService = $platformService;
}
/**
* @param ControllerEvent $event
*
* @return void
*
* @throws LoaderError
* @throws RuntimeError
* @throws SyntaxError
* @throws Exception
*/
public function onKernelController( ControllerEvent $event )
{
$request = $event->getRequest();
if ( in_array(
$request->get( '_route' ),
[
'static_file_folder',
'static_project_file',
'front_common_css_custom',
'global_common_platform_version',
]
) ) {
return;
}
$maintenance = $this->platformService->maintenanceMode();
if ( !isset( $maintenance[ 'enabled' ] ) || !$maintenance[ 'enabled' ] ) {
return;
}
$ips = str_replace( [ '[', ']' ], '', $maintenance[ 'ips' ] );
$ips = explode( ',', $ips );
if ( in_array( $request->getClientIp(), $ips ) ) {
return;
}
$message = $this->twig->render( 'common/maintenance/default.html.twig', [
'project' => $this->platformService->getDomain(),
] );
$event->setController(
function () use ( $message ) {
return new Response( $message, 200 );
}
);
}
}