src/EventSubscriber/Routing/CityPrefixSubscriber.php line 48

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by simpson <simpsonwork@gmail.com>
  4.  * Date: 2019-07-18
  5.  * Time: 17:05
  6.  */
  7. namespace App\EventSubscriber\Routing;
  8. use App\Event\Routing\FilterGeneratedUrlEvent;
  9. use App\Event\Routing\RoutingEvent;
  10. use App\Event\Routing\RoutingEvents;
  11. use App\Routing\DynamicRouter;
  12. use Flagception\Manager\FeatureManagerInterface;
  13. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  14. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  15. class CityPrefixSubscriber implements EventSubscriberInterface
  16. {
  17.     const CITY_PARAMETER 'city';
  18.     private bool $dropDefaultCityPrefix;
  19.     private string $defaultCity;
  20.     public function __construct(FeatureManagerInterface $featuresParameterBagInterface $parameterBag)
  21.     {
  22.         $this->dropDefaultCityPrefix $features->isActive('drop_default_city_prefix');
  23.         $this->defaultCity $parameterBag->get('default_city');
  24.     }
  25.     public function setDefaultCityRouteName(RoutingEvent $event): void
  26.     {
  27.         if (!$this->dropDefaultCityPrefix) {
  28.             return;
  29.         }
  30.         $routeName $event->getName();
  31.         $parameters $event->getParameters();
  32.         if (!isset($parameters[self::CITY_PARAMETER]) || str_starts_with($routeNameDynamicRouter::DEFAULT_CITY_ROUTE_PREFIX)) {
  33.             return;
  34.         }
  35.         if ($parameters[self::CITY_PARAMETER] === $this->defaultCity) {
  36.             $event->setName(DynamicRouter::DEFAULT_CITY_ROUTE_PREFIX.$routeName);
  37.         }
  38.     }
  39.     public function ignoreCityParameter(FilterGeneratedUrlEvent $event): void
  40.     {
  41.         $url $event->getUrl();
  42.         $routeParameters $event->getParameters();
  43.         if (isset($routeParameters[self::CITY_PARAMETER]) && false !== $pos strpos($url'?')) {
  44.             $qs substr($url$pos 1);
  45.             parse_str($qs$parameters);
  46.             unset($parameters[self::CITY_PARAMETER]);
  47.             if (!empty($parameters)) {
  48.                 $url str_replace("?$qs"'?'.http_build_query($parameters), $url);
  49.             } else {
  50.                 $url str_replace("?$qs"''$url);
  51.             }
  52.             $event->setUrl($url);
  53.         }
  54.     }
  55.     /**
  56.      * @inheritDoc
  57.      */
  58.     public static function getSubscribedEvents(): iterable
  59.     {
  60.         return [
  61.             RoutingEvents::PRE_GENERATE => 'setDefaultCityRouteName',
  62.             RoutingEvents::POST_GENERATE => 'ignoreCityParameter',
  63.         ];
  64.     }
  65. }