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;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |