*/ class DisallowedCountryRequestListener { private Environment $twig; private KernelInterface $kernel; private LoggerInterface $logger; private DisallowCountryRepository $repository; public function __construct( Environment $twig, KernelInterface $kernel, LoggerInterface $logger, DisallowCountryRepository $repository ) { $this->twig = $twig; $this->kernel = $kernel; $this->logger = $logger; $this->repository = $repository; } public function onKernelRequest(RequestEvent $event): void { if (!$event->isMasterRequest()) { return; } $this->restrictAccessOnDisallowedCountries($event); } private function restrictAccessOnDisallowedCountries(RequestEvent $event) { try { $request = $event->getRequest(); $reader = new Reader( $this->kernel->getProjectDir() . "/data/geoip_country.mmdb", array_unique([$request->getLocale(), 'fr']) ); $ip = $request->getClientIp(); $record = $reader->country($ip === '127.0.0.1' ? $_ENV['APP_LOCALHOST_IP'] : $ip); $isoCode = $record->country->isoCode; if (in_array($isoCode, $this->repository->getDisallowedCountries())) { $response = new Response(); $response->setStatusCode(Response::HTTP_FORBIDDEN); $response->setContent($this->twig->render("@common/application/disallowed_country.html.twig", [ 'country' => Countries::getName($isoCode), 'iso' => $isoCode ])); $response->headers->set('Content-Type', 'text/html'); $event->setResponse($response); } } catch (AddressNotFoundException | InvalidDatabaseException $e) { $this->logger->error($e->getMessage(), $e->getTrace()); } } }