<?php
/**
* Created by simpson <simpsonwork@gmail.com>
* Date: 2019-07-18
* Time: 14:15
*/
namespace App\Routing;
use App\Event\Routing\FilterGeneratedUrlEvent;
use App\Event\Routing\RoutingEvent;
use App\Event\Routing\RoutingEvents;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\CacheWarmer\WarmableInterface;
use Symfony\Component\Routing\Matcher\RequestMatcherInterface;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\Router;
use Symfony\Component\Routing\RouterInterface;
class DynamicRouter implements RouterInterface, RequestMatcherInterface, WarmableInterface
{
/**
* Префикс названий роутов, которые были переопределены, но старые адреса при этом оставлены
*/
const OVERRIDDEN_ROUTE_PREFIX = '_overridden.';
/**
* Суффикс названий роутов для пагинации
*/
const PAGINATION_ROUTE_POSTFIX = '._pagination';
/**
* Параметр в настройках переопределенного роута, указывающий на новый роут
*/
const OVERRIDDEN_ROUTE_PARAMETER = '_overridden_route_name';
public function __construct(
protected Router $router,
protected ?EventDispatcherInterface $eventDispatcher = null
) {}
/**
* @inheritDoc
*/
public function generate($name, $parameters = [], $referenceType = self::ABSOLUTE_PATH): string
{
if ($this->eventDispatcher) {
$event = new RoutingEvent($name, $parameters, $referenceType);
$this->eventDispatcher->dispatch($event, RoutingEvents::PRE_GENERATE);
$name = $event->getName();
$parameters = $event->getParameters();
$referenceType = $event->getReferenceType();
}
$url = $this->router->generate($name, $parameters, $referenceType);
if ($this->eventDispatcher) {
$event = new FilterGeneratedUrlEvent($url, $name, $parameters, $referenceType);
$this->eventDispatcher->dispatch($event, RoutingEvents::POST_GENERATE);
$url = $event->getUrl();
}
return $url;
}
/**
* @inheritDoc
*/
public function setContext(RequestContext $context): void
{
$this->router->setContext($context);
}
/**
* @inheritDoc
*/
public function getContext(): RequestContext
{
return $this->router->getContext();
}
/**
* @inheritDoc
*/
public function matchRequest(Request $request): array
{
return $this->router->matchRequest($request);
}
/**
* @inheritDoc
*/
public function getRouteCollection()
{
return $this->router->getRouteCollection();
}
public function warmUp(string $cacheDir): void
{
}
/**
* @inheritDoc
*/
public function match($pathinfo): array
{
return $this->router->match($pathinfo);
}
}