vendor/symfony-cmf/routing-bundle/src/Routing/DynamicRouter.php line 67
<?php
/*
* This file is part of the Symfony CMF package.
*
* (c) Symfony CMF
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Cmf\Bundle\RoutingBundle\Routing;
use Symfony\Cmf\Component\Routing\DynamicRouter as BaseDynamicRouter;
use Symfony\Cmf\Component\Routing\RouteObjectInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
/**
* Symfony framework integration of the CMF routing component DynamicRouter class.
*
* @author Filippo de Santis
* @author David Buchmann
* @author Lukas Smith
* @author Nacho Martìn
*/
class DynamicRouter extends BaseDynamicRouter
{
/**
* key for the request attribute that contains the route document.
*/
public const ROUTE_KEY = 'routeDocument';
/**
* key for the request attribute that contains the content document if this
* route has one associated.
*/
public const CONTENT_KEY = 'contentDocument';
/**
* key for the request attribute that contains the template this document
* wants to use.
*/
public const CONTENT_TEMPLATE = 'template';
private RequestStack $requestStack;
/**
* Put content and template name into the request attributes instead of the
* route defaults.
*
* {@inheritdoc}
*
* The match should identify a controller for symfony. This can either be
* the fully qualified class name or the service name of a controller that
* is registered as a service. In both cases, the action to call on that
* controller is appended, separated with two colons.
*/
public function match(string $url): array
{
$defaults = parent::match($url);
return $this->cleanDefaults($defaults);
}
public function matchRequest(Request $request): array
{
$defaults = parent::matchRequest($request);
return $this->cleanDefaults($defaults, $request);
}
/**
* Clean up the match data and move some values into the request attributes.
*
* @param array<string, string> $defaults The defaults from the match
* @param Request|null $request The request object if available
*
* @return array<string, string> the updated defaults to return for this match
*/
protected function cleanDefaults(array $defaults, Request $request = null): array
{
if (null === $request) {
$request = $this->getRequest();
}
if (\array_key_exists(RouteObjectInterface::ROUTE_OBJECT, $defaults)) {
$request->attributes->set(self::ROUTE_KEY, $defaults[RouteObjectInterface::ROUTE_OBJECT]);
unset($defaults[RouteObjectInterface::ROUTE_OBJECT]);
}
if (\array_key_exists(RouteObjectInterface::CONTENT_OBJECT, $defaults)) {
$request->attributes->set(self::CONTENT_KEY, $defaults[RouteObjectInterface::CONTENT_OBJECT]);
unset($defaults[RouteObjectInterface::CONTENT_OBJECT]);
}
if (\array_key_exists(RouteObjectInterface::TEMPLATE_NAME, $defaults)) {
$request->attributes->set(self::CONTENT_TEMPLATE, $defaults[RouteObjectInterface::TEMPLATE_NAME]);
unset($defaults[RouteObjectInterface::TEMPLATE_NAME]);
}
return $defaults;
}
/**
* Set the request stack so that we can find the current request.
*/
public function setRequestStack(RequestStack $requestStack): void
{
$this->requestStack = $requestStack;
}
/**
* Get the current request from the request stack.
*
* @throws ResourceNotFoundException
*/
public function getRequest(): Request
{
$currentRequest = $this->requestStack->getCurrentRequest();
if (!$currentRequest) {
throw new ResourceNotFoundException('There is no request in the request stack');
}
return $currentRequest;
}
}