Chris@0: Chris@0: * Chris@0: * For the full copyright and license information, please view the LICENSE Chris@0: * file that was distributed with this source code. Chris@0: */ Chris@0: Chris@0: namespace Symfony\Component\Routing\Generator\Dumper; Chris@0: Chris@0: /** Chris@0: * PhpGeneratorDumper creates a PHP class able to generate URLs for a given set of routes. Chris@0: * Chris@0: * @author Fabien Potencier Chris@0: * @author Tobias Schultze Chris@0: */ Chris@0: class PhpGeneratorDumper extends GeneratorDumper Chris@0: { Chris@0: /** Chris@0: * Dumps a set of routes to a PHP class. Chris@0: * Chris@0: * Available options: Chris@0: * Chris@0: * * class: The class name Chris@0: * * base_class: The base class name Chris@0: * Chris@0: * @param array $options An array of options Chris@0: * Chris@0: * @return string A PHP class representing the generator class Chris@0: */ Chris@17: public function dump(array $options = []) Chris@0: { Chris@17: $options = array_merge([ Chris@0: 'class' => 'ProjectUrlGenerator', Chris@0: 'base_class' => 'Symfony\\Component\\Routing\\Generator\\UrlGenerator', Chris@17: ], $options); Chris@0: Chris@0: return <<context = \$context; Chris@0: \$this->logger = \$logger; Chris@0: if (null === self::\$declaredRoutes) { Chris@0: self::\$declaredRoutes = {$this->generateDeclaredRoutes()}; Chris@0: } Chris@0: } Chris@0: Chris@0: {$this->generateGenerateMethod()} Chris@0: } Chris@0: Chris@0: EOF; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Generates PHP code representing an array of defined routes Chris@0: * together with the routes properties (e.g. requirements). Chris@0: * Chris@0: * @return string PHP code Chris@0: */ Chris@0: private function generateDeclaredRoutes() Chris@0: { Chris@17: $routes = "[\n"; Chris@0: foreach ($this->getRoutes()->all() as $name => $route) { Chris@0: $compiledRoute = $route->compile(); Chris@0: Chris@17: $properties = []; Chris@0: $properties[] = $compiledRoute->getVariables(); Chris@0: $properties[] = $route->getDefaults(); Chris@0: $properties[] = $route->getRequirements(); Chris@0: $properties[] = $compiledRoute->getTokens(); Chris@0: $properties[] = $compiledRoute->getHostTokens(); Chris@0: $properties[] = $route->getSchemes(); Chris@0: Chris@0: $routes .= sprintf(" '%s' => %s,\n", $name, str_replace("\n", '', var_export($properties, true))); Chris@0: } Chris@17: $routes .= ' ]'; Chris@0: Chris@0: return $routes; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Generates PHP code representing the `generate` method that implements the UrlGeneratorInterface. Chris@0: * Chris@0: * @return string PHP code Chris@0: */ Chris@0: private function generateGenerateMethod() Chris@0: { Chris@0: return <<<'EOF' Chris@17: public function generate($name, $parameters = [], $referenceType = self::ABSOLUTE_PATH) Chris@0: { Chris@0: if (!isset(self::$declaredRoutes[$name])) { Chris@0: throw new RouteNotFoundException(sprintf('Unable to generate a URL for the named route "%s" as such route does not exist.', $name)); Chris@0: } Chris@0: Chris@0: list($variables, $defaults, $requirements, $tokens, $hostTokens, $requiredSchemes) = self::$declaredRoutes[$name]; Chris@0: Chris@0: return $this->doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $referenceType, $hostTokens, $requiredSchemes); Chris@0: } Chris@0: EOF; Chris@0: } Chris@0: }