122 lines
3.9 KiB
PHP
122 lines
3.9 KiB
PHP
|
<?php
|
||
|
|
||
|
/*
|
||
|
* This file is part of the Symfony package.
|
||
|
*
|
||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||
|
*
|
||
|
* For the full copyright and license information, please view the LICENSE
|
||
|
* file that was distributed with this source code.
|
||
|
*/
|
||
|
|
||
|
namespace Symfony\Component\Routing\Generator\Dumper;
|
||
|
|
||
|
use Symfony\Component\Routing\Exception\RouteCircularReferenceException;
|
||
|
use Symfony\Component\Routing\Exception\RouteNotFoundException;
|
||
|
use Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherDumper;
|
||
|
|
||
|
/**
|
||
|
* CompiledUrlGeneratorDumper creates a PHP array to be used with CompiledUrlGenerator.
|
||
|
*
|
||
|
* @author Fabien Potencier <fabien@symfony.com>
|
||
|
* @author Tobias Schultze <http://tobion.de>
|
||
|
* @author Nicolas Grekas <p@tchwork.com>
|
||
|
*/
|
||
|
class CompiledUrlGeneratorDumper extends GeneratorDumper
|
||
|
{
|
||
|
public function getCompiledRoutes(): array
|
||
|
{
|
||
|
$compiledRoutes = [];
|
||
|
foreach ($this->getRoutes()->all() as $name => $route) {
|
||
|
$compiledRoute = $route->compile();
|
||
|
|
||
|
$compiledRoutes[$name] = [
|
||
|
$compiledRoute->getVariables(),
|
||
|
$route->getDefaults(),
|
||
|
$route->getRequirements(),
|
||
|
$compiledRoute->getTokens(),
|
||
|
$compiledRoute->getHostTokens(),
|
||
|
$route->getSchemes(),
|
||
|
[],
|
||
|
];
|
||
|
}
|
||
|
|
||
|
return $compiledRoutes;
|
||
|
}
|
||
|
|
||
|
public function getCompiledAliases(): array
|
||
|
{
|
||
|
$routes = $this->getRoutes();
|
||
|
$compiledAliases = [];
|
||
|
foreach ($routes->getAliases() as $name => $alias) {
|
||
|
$deprecations = $alias->isDeprecated() ? [$alias->getDeprecation($name)] : [];
|
||
|
$currentId = $alias->getId();
|
||
|
$visited = [];
|
||
|
while (null !== $alias = $routes->getAlias($currentId) ?? null) {
|
||
|
if (false !== $searchKey = array_search($currentId, $visited)) {
|
||
|
$visited[] = $currentId;
|
||
|
|
||
|
throw new RouteCircularReferenceException($currentId, \array_slice($visited, $searchKey));
|
||
|
}
|
||
|
|
||
|
if ($alias->isDeprecated()) {
|
||
|
$deprecations[] = $deprecation = $alias->getDeprecation($currentId);
|
||
|
trigger_deprecation($deprecation['package'], $deprecation['version'], $deprecation['message']);
|
||
|
}
|
||
|
|
||
|
$visited[] = $currentId;
|
||
|
$currentId = $alias->getId();
|
||
|
}
|
||
|
|
||
|
if (null === $target = $routes->get($currentId)) {
|
||
|
throw new RouteNotFoundException(sprintf('Target route "%s" for alias "%s" does not exist.', $currentId, $name));
|
||
|
}
|
||
|
|
||
|
$compiledTarget = $target->compile();
|
||
|
|
||
|
$compiledAliases[$name] = [
|
||
|
$compiledTarget->getVariables(),
|
||
|
$target->getDefaults(),
|
||
|
$target->getRequirements(),
|
||
|
$compiledTarget->getTokens(),
|
||
|
$compiledTarget->getHostTokens(),
|
||
|
$target->getSchemes(),
|
||
|
$deprecations,
|
||
|
];
|
||
|
}
|
||
|
|
||
|
return $compiledAliases;
|
||
|
}
|
||
|
|
||
|
public function dump(array $options = []): string
|
||
|
{
|
||
|
return <<<EOF
|
||
|
<?php
|
||
|
|
||
|
// This file has been auto-generated by the Symfony Routing Component.
|
||
|
|
||
|
return [{$this->generateDeclaredRoutes()}
|
||
|
];
|
||
|
|
||
|
EOF;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Generates PHP code representing an array of defined routes
|
||
|
* together with the routes properties (e.g. requirements).
|
||
|
*/
|
||
|
private function generateDeclaredRoutes(): string
|
||
|
{
|
||
|
$routes = '';
|
||
|
foreach ($this->getCompiledRoutes() as $name => $properties) {
|
||
|
$routes .= sprintf("\n '%s' => %s,", $name, CompiledUrlMatcherDumper::export($properties));
|
||
|
}
|
||
|
|
||
|
foreach ($this->getCompiledAliases() as $alias => $properties) {
|
||
|
$routes .= sprintf("\n '%s' => %s,", $alias, CompiledUrlMatcherDumper::export($properties));
|
||
|
}
|
||
|
|
||
|
return $routes;
|
||
|
}
|
||
|
}
|