]>
Commit | Line | Data |
---|---|---|
4f5b44bd NL |
1 | <?php |
2 | ||
3 | /* | |
4 | * This file is part of the Symfony package. | |
5 | * | |
6 | * (c) Fabien Potencier <fabien@symfony.com> | |
7 | * | |
8 | * For the full copyright and license information, please view the LICENSE | |
9 | * file that was distributed with this source code. | |
10 | */ | |
11 | ||
12 | namespace Symfony\Component\Routing\Generator\Dumper; | |
13 | ||
14 | /** | |
15 | * PhpGeneratorDumper creates a PHP class able to generate URLs for a given set of routes. | |
16 | * | |
17 | * @author Fabien Potencier <fabien@symfony.com> | |
18 | * @author Tobias Schultze <http://tobion.de> | |
19 | * | |
20 | * @api | |
21 | */ | |
22 | class PhpGeneratorDumper extends GeneratorDumper | |
23 | { | |
24 | /** | |
25 | * Dumps a set of routes to a PHP class. | |
26 | * | |
27 | * Available options: | |
28 | * | |
29 | * * class: The class name | |
30 | * * base_class: The base class name | |
31 | * | |
32 | * @param array $options An array of options | |
33 | * | |
34 | * @return string A PHP class representing the generator class | |
35 | * | |
36 | * @api | |
37 | */ | |
38 | public function dump(array $options = array()) | |
39 | { | |
40 | $options = array_merge(array( | |
41 | 'class' => 'ProjectUrlGenerator', | |
42 | 'base_class' => 'Symfony\\Component\\Routing\\Generator\\UrlGenerator', | |
43 | ), $options); | |
44 | ||
45 | return <<<EOF | |
46 | <?php | |
47 | ||
48 | use Symfony\Component\Routing\RequestContext; | |
49 | use Symfony\Component\Routing\Exception\RouteNotFoundException; | |
50 | use Psr\Log\LoggerInterface; | |
51 | ||
52 | /** | |
53 | * {$options['class']} | |
54 | * | |
55 | * This class has been auto-generated | |
56 | * by the Symfony Routing Component. | |
57 | */ | |
58 | class {$options['class']} extends {$options['base_class']} | |
59 | { | |
60 | static private \$declaredRoutes = {$this->generateDeclaredRoutes()}; | |
61 | ||
62 | /** | |
63 | * Constructor. | |
64 | */ | |
65 | public function __construct(RequestContext \$context, LoggerInterface \$logger = null) | |
66 | { | |
67 | \$this->context = \$context; | |
68 | \$this->logger = \$logger; | |
69 | } | |
70 | ||
71 | {$this->generateGenerateMethod()} | |
72 | } | |
73 | ||
74 | EOF; | |
75 | } | |
76 | ||
77 | /** | |
78 | * Generates PHP code representing an array of defined routes | |
79 | * together with the routes properties (e.g. requirements). | |
80 | * | |
81 | * @return string PHP code | |
82 | */ | |
83 | private function generateDeclaredRoutes() | |
84 | { | |
85 | $routes = "array(\n"; | |
86 | foreach ($this->getRoutes()->all() as $name => $route) { | |
87 | $compiledRoute = $route->compile(); | |
88 | ||
89 | $properties = array(); | |
90 | $properties[] = $compiledRoute->getVariables(); | |
91 | $properties[] = $route->getDefaults(); | |
92 | $properties[] = $route->getRequirements(); | |
93 | $properties[] = $compiledRoute->getTokens(); | |
94 | $properties[] = $compiledRoute->getHostTokens(); | |
95 | ||
96 | $routes .= sprintf(" '%s' => %s,\n", $name, str_replace("\n", '', var_export($properties, true))); | |
97 | } | |
98 | $routes .= ' )'; | |
99 | ||
100 | return $routes; | |
101 | } | |
102 | ||
103 | /** | |
104 | * Generates PHP code representing the `generate` method that implements the UrlGeneratorInterface. | |
105 | * | |
106 | * @return string PHP code | |
107 | */ | |
108 | private function generateGenerateMethod() | |
109 | { | |
110 | return <<<EOF | |
111 | public function generate(\$name, \$parameters = array(), \$referenceType = self::ABSOLUTE_PATH) | |
112 | { | |
113 | if (!isset(self::\$declaredRoutes[\$name])) { | |
114 | throw new RouteNotFoundException(sprintf('Unable to generate a URL for the named route "%s" as such route does not exist.', \$name)); | |
115 | } | |
116 | ||
117 | list(\$variables, \$defaults, \$requirements, \$tokens, \$hostTokens) = self::\$declaredRoutes[\$name]; | |
118 | ||
119 | return \$this->doGenerate(\$variables, \$defaults, \$requirements, \$tokens, \$parameters, \$name, \$referenceType, \$hostTokens); | |
120 | } | |
121 | EOF; | |
122 | } | |
123 | } |