<?php
/**
* Created by simpson <simpsonwork@gmail.com>
* Date: 2019-07-18
* Time: 17:05
*/
namespace App\EventSubscriber\Routing;
use App\Event\Routing\FilterGeneratedUrlEvent;
use App\Event\Routing\RoutingEvent;
use App\Event\Routing\RoutingEvents;
use App\Routing\DynamicRouter;
use Flagception\Manager\FeatureManagerInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class CityPrefixSubscriber implements EventSubscriberInterface
{
const CITY_PARAMETER = 'city';
private bool $dropDefaultCityPrefix;
private string $defaultCity;
public function __construct(FeatureManagerInterface $features, ParameterBagInterface $parameterBag)
{
$this->dropDefaultCityPrefix = $features->isActive('drop_default_city_prefix');
$this->defaultCity = $parameterBag->get('default_city');
}
public function setDefaultCityRouteName(RoutingEvent $event): void
{
if (!$this->dropDefaultCityPrefix) {
return;
}
$routeName = $event->getName();
$parameters = $event->getParameters();
if (!isset($parameters[self::CITY_PARAMETER]) || str_starts_with($routeName, DynamicRouter::DEFAULT_CITY_ROUTE_PREFIX)) {
return;
}
if ($parameters[self::CITY_PARAMETER] === $this->defaultCity) {
$event->setName(DynamicRouter::DEFAULT_CITY_ROUTE_PREFIX.$routeName);
}
}
public function ignoreCityParameter(FilterGeneratedUrlEvent $event): void
{
$url = $event->getUrl();
$routeParameters = $event->getParameters();
if (isset($routeParameters[self::CITY_PARAMETER]) && false !== $pos = strpos($url, '?')) {
$qs = substr($url, $pos + 1);
parse_str($qs, $parameters);
unset($parameters[self::CITY_PARAMETER]);
if (!empty($parameters)) {
$url = str_replace("?$qs", '?'.http_build_query($parameters), $url);
} else {
$url = str_replace("?$qs", '', $url);
}
$event->setUrl($url);
}
}
/**
* @inheritDoc
*/
public static function getSubscribedEvents(): iterable
{
return [
RoutingEvents::PRE_GENERATE => 'setDefaultCityRouteName',
RoutingEvents::POST_GENERATE => 'ignoreCityParameter',
];
}
}