src/EventSubscriber/RequestSubscriber.php line 60

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Manager\UserManager;
  4. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  5. use Symfony\Component\HttpKernel\Event\RequestEvent;
  6. use App\Security\Authenticator\UserAuthenticator;
  7. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  8. use Symfony\Component\Routing\RouterInterface;
  9. use Symfony\Component\Security\Core\Security;
  10. use Symfony\Component\Security\Guard\GuardAuthenticatorHandler;
  11. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  12. use Symfony\Component\HttpFoundation\RedirectResponse;
  13. use Symfony\Component\HttpKernel\KernelEvents;
  14. class RequestSubscriber implements EventSubscriberInterface
  15. {
  16. public const VERSION_INFORMATION_ROUTE = 'version';
  17. /**
  18. * @var RouterInterface
  19. */
  20. protected $router;
  21. /**
  22. * @var ParameterBagInterface
  23. */
  24. protected $params;
  25. /**
  26. * @var UserManager
  27. */
  28. protected $userManager;
  29. /**
  30. * @var Security
  31. */
  32. protected $security;
  33. public function __construct(
  34. ParameterBagInterface $parameterBag,
  35. RouterInterface $router,
  36. UserManager $userManager,
  37. Security $security
  38. ) {
  39. $this->params = $parameterBag;
  40. $this->router = $router;
  41. $this->userManager = $userManager;
  42. $this->security = $security;
  43. }
  44. public static function getSubscribedEvents(): array
  45. {
  46. return [
  47. KernelEvents::REQUEST => 'onKernelRequest'
  48. ];
  49. }
  50. public function onKernelRequest(RequestEvent $event)
  51. {
  52. $request = $event->getRequest();
  53. $session = $request->getSession();
  54. $context = $session->get('context');
  55. $supportedLocales = $this->params->get('language.supported');
  56. $preferredLanguage = $request->getPreferredLanguage($supportedLocales);
  57. $request->setDefaultLocale($preferredLanguage);
  58. $route = $request->attributes->get('_route');
  59. $format = $request->attributes->get("_format");
  60. if (
  61. (
  62. in_array($route, ['_wdt', '_errors'])
  63. || '_profiler' === substr($route, 0, 9) || in_array($format, ['js', 'css', 'images'])
  64. )
  65. || self::VERSION_INFORMATION_ROUTE === $route ||
  66. !$event->isMainRequest()
  67. ) {
  68. return;
  69. }
  70. $ticketingModule = $this->params->get('module_activation.ticketing_module');
  71. $simModule = $this->params->get('module_activation.sim_module');
  72. $widgetModule = $this->params->get('module_activation.widget_module');
  73. if (!$simModule && !$ticketingModule && !$widgetModule) {
  74. $event->setResponse(new \Symfony\Component\HttpFoundation\Response(""));
  75. return;
  76. }
  77. if (!$simModule && $ticketingModule) {
  78. if (in_array($route, ["homepage"])) {
  79. throw new NotFoundHttpException('app not enabled');
  80. }
  81. }
  82. if (!$simModule && !$ticketingModule && $context != 'WIDGET') {
  83. if (in_array(
  84. $route,
  85. [
  86. "homepage",
  87. "journey.list",
  88. "journey.schedule",
  89. "schedule",
  90. "line.schedule.list",
  91. "ticketing.homepage"
  92. ]
  93. )) {
  94. $event->setResponse(new \Symfony\Component\HttpFoundation\Response(""));
  95. }
  96. }
  97. // Widget
  98. if (strpos($request->getPathInfo(), 'widget') !== false) {
  99. $environment = $this->params->get('kernel.environment');
  100. if (!$widgetModule && $environment != 'dev') {
  101. $event->setResponse(new \Symfony\Component\HttpFoundation\Response(""));
  102. return;
  103. }
  104. }
  105. // Redirect to default language if current language doesn't exist
  106. $start = strpos($request->getPathInfo(), '/', 0);
  107. $end = strpos($request->getPathInfo(), '/', $start + 1);
  108. if (false === $end) {
  109. $locale = substr($request->getPathInfo(), $start + 1);
  110. } else {
  111. $locale = substr($request->getPathInfo(), $start + 1, $end - 1);
  112. }
  113. if (!empty($locale) && !in_array($locale, $supportedLocales)) {
  114. $queryParams = $request->query->all();
  115. $parameters = $this->buildQueryParams($queryParams, array_keys($queryParams));
  116. $parameters = !empty($parameters) ? '?' . $parameters : '';
  117. $path = str_replace($locale, $request->getLocale(), $request->getPathInfo());
  118. $event->setResponse(new RedirectResponse($path . $parameters));
  119. }
  120. }
  121. public function buildQueryParams(array $values, array $keys): string
  122. {
  123. return implode(
  124. '&',
  125. array_map(
  126. function ($v, $k) {
  127. if (is_array($v)) {
  128. $k = $k . '[]';
  129. return $this->buildQueryParams($v, array_fill(0, count($v), $k));
  130. }
  131. return sprintf("%s=%s", $k, $v);
  132. },
  133. $values,
  134. $keys
  135. )
  136. );
  137. }
  138. }