<?php
namespace App\EventSubscriber;
use App\Manager\UserManager;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use App\Security\Authenticator\UserAuthenticator;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Security\Guard\GuardAuthenticatorHandler;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\KernelEvents;
class RequestSubscriber implements EventSubscriberInterface
{
public const VERSION_INFORMATION_ROUTE = 'version';
/**
* @var RouterInterface
*/
protected $router;
/**
* @var ParameterBagInterface
*/
protected $params;
/**
* @var UserManager
*/
protected $userManager;
/**
* @var Security
*/
protected $security;
public function __construct(
ParameterBagInterface $parameterBag,
RouterInterface $router,
UserManager $userManager,
Security $security
) {
$this->params = $parameterBag;
$this->router = $router;
$this->userManager = $userManager;
$this->security = $security;
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => 'onKernelRequest'
];
}
public function onKernelRequest(RequestEvent $event)
{
$request = $event->getRequest();
$session = $request->getSession();
$context = $session->get('context');
$supportedLocales = $this->params->get('language.supported');
$preferredLanguage = $request->getPreferredLanguage($supportedLocales);
$request->setDefaultLocale($preferredLanguage);
$route = $request->attributes->get('_route');
$format = $request->attributes->get("_format");
if (
(
in_array($route, ['_wdt', '_errors'])
|| '_profiler' === substr($route, 0, 9) || in_array($format, ['js', 'css', 'images'])
)
|| self::VERSION_INFORMATION_ROUTE === $route ||
!$event->isMainRequest()
) {
return;
}
$ticketingModule = $this->params->get('module_activation.ticketing_module');
$simModule = $this->params->get('module_activation.sim_module');
$widgetModule = $this->params->get('module_activation.widget_module');
if (!$simModule && !$ticketingModule && !$widgetModule) {
$event->setResponse(new \Symfony\Component\HttpFoundation\Response(""));
return;
}
if (!$simModule && $ticketingModule) {
if (in_array($route, ["homepage"])) {
throw new NotFoundHttpException('app not enabled');
}
}
if (!$simModule && !$ticketingModule && $context != 'WIDGET') {
if (in_array(
$route,
[
"homepage",
"journey.list",
"journey.schedule",
"schedule",
"line.schedule.list",
"ticketing.homepage"
]
)) {
$event->setResponse(new \Symfony\Component\HttpFoundation\Response(""));
}
}
// Widget
if (strpos($request->getPathInfo(), 'widget') !== false) {
$environment = $this->params->get('kernel.environment');
if (!$widgetModule && $environment != 'dev') {
$event->setResponse(new \Symfony\Component\HttpFoundation\Response(""));
return;
}
}
// Redirect to default language if current language doesn't exist
$start = strpos($request->getPathInfo(), '/', 0);
$end = strpos($request->getPathInfo(), '/', $start + 1);
if (false === $end) {
$locale = substr($request->getPathInfo(), $start + 1);
} else {
$locale = substr($request->getPathInfo(), $start + 1, $end - 1);
}
if (!empty($locale) && !in_array($locale, $supportedLocales)) {
$queryParams = $request->query->all();
$parameters = $this->buildQueryParams($queryParams, array_keys($queryParams));
$parameters = !empty($parameters) ? '?' . $parameters : '';
$path = str_replace($locale, $request->getLocale(), $request->getPathInfo());
$event->setResponse(new RedirectResponse($path . $parameters));
}
}
public function buildQueryParams(array $values, array $keys): string
{
return implode(
'&',
array_map(
function ($v, $k) {
if (is_array($v)) {
$k = $k . '[]';
return $this->buildQueryParams($v, array_fill(0, count($v), $k));
}
return sprintf("%s=%s", $k, $v);
},
$values,
$keys
)
);
}
}