vendor/abap/application-context-bundle/src/EventSubscriber/ApplicationContextSubscriber.php line 39

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Abap\ApplicationContextBundle\EventSubscriber;
  4. use Abap\ApplicationContextBundle\ConfigurationLoader\ConfigurationLoaderRegistry;
  5. use Abap\ApplicationContextBundle\Context\ApplicationContext;
  6. use Abap\ApplicationContextBundle\Context\ApplicationContextInterface;
  7. use Abap\ApplicationContextBundle\Context\ApplicationContextRegistry;
  8. use Abap\ThemeBundle\Context\ThemeContextInterface;
  9. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\HttpKernel\Event\RequestEvent;
  12. use Symfony\Component\HttpKernel\KernelEvents;
  13. final class ApplicationContextSubscriber implements EventSubscriberInterface
  14. {
  15.     private ThemeContextInterface $currentThemeContext;
  16.     private ConfigurationLoaderRegistry $configurationLoaderRegistry;
  17.     private ApplicationContextRegistry $applicationContextRegistry;
  18.     public function __construct(ThemeContextInterface $themeContextConfigurationLoaderRegistry $configurationLoaderRegistryApplicationContextRegistry $applicationContextRegistry)
  19.     {
  20.         $this->currentThemeContext                $themeContext;
  21.         $this->configurationLoaderRegistry $configurationLoaderRegistry;
  22.         $this->applicationContextRegistry $applicationContextRegistry;
  23.     }
  24.     public static function getSubscribedEvents()
  25.     {
  26.         return [
  27.             KernelEvents::REQUEST => [
  28.                 ['loadApplicationContext'50],
  29.             ],
  30.         ];
  31.     }
  32.     public function loadApplicationContext(RequestEvent $event): void
  33.     {
  34.         $request $event->getRequest();
  35.         if (!$event->isMainRequest()) {
  36.             return;
  37.         }
  38.         $this->applicationContextRegistry->unsetCurrent();
  39.         foreach ($this->configurationLoaderRegistry->all() as $configurationLoader) {
  40.             if (null === $availableContexts $configurationLoader->load()) {
  41.                 continue;
  42.             }
  43.             foreach ($availableContexts as $contextCode=>$contextData) {
  44.                 $applicationContext = new ApplicationContext();
  45.                 $applicationContext->loadData($contextCode$contextData);
  46.                 $this->applicationContextRegistry->addContext($applicationContext);
  47.                 if (!$this->applicationContextRegistry->hasCurrent() && $this->isApplicable($request$applicationContext)) {
  48.                     $this->applicationContextRegistry->setCurrent($applicationContext->getCode());
  49.                     $this->currentThemeContext->loadTheme($applicationContext->getTheme());
  50.                 }
  51.             }
  52.         }
  53.     }
  54.     private function isApplicable(Request $requestApplicationContext $applicationContext): bool
  55.     {
  56.         if ($this->isExcludedPath($request$applicationContext)) {
  57.             return false;
  58.         }
  59.         $path $applicationContext->getPath();
  60.         if (empty($path) || '/' === $path) {
  61.             return true;
  62.         }
  63.         $reg        '/^' preg_quote($path'/') . '($|\/|\?)/';
  64.         $requestUri $request->getRequestUri();
  65.         return (bool) preg_match($reg$requestUri);
  66.     }
  67.     public function isExcludedPath(Request $requestApplicationContext $applicationContext): bool
  68.     {
  69.         $requestUri $request->getRequestUri();
  70.         foreach ($applicationContext->getExcludedPaths() as $excludedPath) {
  71.             $reg '/^' preg_quote($excludedPath'/') . '($|\/|\?)/';
  72.             if ((bool)preg_match($reg$requestUri)) {
  73.                 return true;
  74.             }
  75.         }
  76.         return false;
  77.     }
  78. }