123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- <?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;
- }
- /**
- * {@inheritdoc}
- */
- public function dump(array $options = [])
- {
- 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;
- }
- }
|