8000 [Routing] added hostname matching support to UrlGenerator · symfony/symfony@805806a · GitHub
[go: up one dir, main page]

Skip to content

Commit 805806a

Browse files
committed
[Routing] added hostname matching support to UrlGenerator
1 parent 7a15e00 commit 805806a

File tree

3 files changed

+35
-5
lines changed

3 files changed

+35
-5
lines changed

src/Symfony/Component/Routing/Generator/Dumper/PhpGeneratorDumper.php

+3-2
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ private function generateDeclaredRoutes()
9191
$properties[] = $route->getDefaults();
9292
$properties[] = $route->getRequirements();
9393
$properties[] = $compiledRoute->getTokens();
94+
$properties[] = $compiledRoute->getHostnameTokens();
9495

9596
$routes .= sprintf(" '%s' => %s,\n", $name, str_replace("\n", '', var_export($properties, true)));
9697
}
@@ -113,9 +114,9 @@ public function generate(\$name, \$parameters = array(), \$absolute = false)
113114
throw new RouteNotFoundException(sprintf('Route "%s" does not exist.', \$name));
114115
}
115116
116-
list(\$variables, \$defaults, \$requirements, \$tokens) = self::\$declaredRoutes[\$name];
117+
list(\$variables, \$defaults, \$requirements, \$tokens, \$hostnameTokens) = self::\$declaredRoutes[\$name];
117118
118-
return \$this->doGenerate(\$variables, \$defaults, \$requirements, \$tokens, \$parameters, \$name, \$absolute);
119+
return \$this->doGenerate(\$variables, \$defaults, \$requirements, \$tokens, \$parameters, \$name, \$absolute, \$hostnameTokens);
119120
}
120121
EOF;
121122
}

src/Symfony/Component/Routing/Generator/UrlGenerator.php

+31-3
Original file line numberDiff line numberDiff line change
@@ -122,14 +122,14 @@ public function generate($name, $parameters = array(), $absolute = false)
122122
// the Route has a cache of its own and is not recompiled as long as it does not get modified
123123
$compiledRoute = $route->compile();
124124

125-
return $this->doGenerate($compiledRoute->getVariables(), $route->getDefaults(), $route->getRequirements(), $compiledRoute->getTokens(), $parameters, $name, $absolute);
125+
return $this->doGenerate($compiledRoute->getVariables(), $route->getDefaults(), $route->getRequirements(), $compiledRoute->getTokens(), $parameters, $name, $absolute, $compiledRoute->getHostnameTokens());
126126
}
127127

128128
/**
129129
* @throws MissingMandatoryParametersException When route has some missing mandatory parameters
130130
* @throws InvalidParameterException When a parameter value is not correct
131131
*/
132-
protected function doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $absolute)
132+
protected function doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $absolute, $hostnameTokens)
133133
{
134134
$variables = array_flip($variables);
135135
$mergedParams = array_replace($defaults, $this->context->getParameters(), $parameters);
@@ -185,6 +185,25 @@ protected function doGenerate($variables, $defaults, $requirements, $tokens, $pa
185185
$url = substr($url, 0, -1) . '%2E';
186186
}
187187

188+
if ($hostnameTokens) {
189+
$host = '';
190+
foreach ($hostnameTokens as $token) {
191+
if ('variable' === $token[0]) {
192+
if (in_array($tparams[$token[3]], array(null, '', false), true)) {
193+
// check requirement
194+
if ($tparams[$token[3]] && !preg_match('#^'.$token[2].'$#', $tparams[$token[3]])) {
195+
throw new InvalidParameterException(sprintf('Parameter "%s" for route "%s" must match "%s" ("%s" given).', $token[3], $name, $token[2], $tparams[$token[3]]));
196+
}
197+
}
198+
199+
$host = $token[1].$tparams[$token[3]].$host;
200+
201+
} elseif ('text' === $token[0]) {
202+
$host = $token[1].$host;
203+
}
204+
}
205+
}
206+
188207
// add a query string if needed
189208
$extra = array_diff_key($parameters, $variables);
190209
if ($extra && $query = http_build_query($extra, '', '&')) {
@@ -198,15 +217,24 @@ protected function doGenerate($variables, $defaults, $requirements, $tokens, $pa
198217
$scheme = $req;
199218
}
200219

220+
if ($hostnameTokens) {
221+
$absolute = true;
222+
}
223+
201224
if ($absolute) {
225+
226+
if (!$hostnameTokens) {
227+
$host = $this->context->getHost();
228+
}
229+
202230
$port = '';
203231
if ('http' === $scheme && 80 != $this->context->getHttpPort()) {
204232
$port = ':'.$this->context->getHttpPort();
205233
} elseif ('https' === $scheme && 443 != $this->context->getHttpsPort()) {
206234
$port = ':'.$this->context->getHttpsPort();
207235
}
208236

209-
$url = $scheme.'://'.$this->context->getHost().$port.$url;
237+
$url = $scheme.'://'.$host.$port.$url;
210238
}
211239
}
212240

src/Symfony/Component/Routing/Tests/Generator/Dumper/PhpGeneratorDumperTest.php

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Symfony\Component\Routing\Route;
1616
use Symfony\Component\Routing\Generator\Dumper\PhpGeneratorDumper;
1717
use Symfony\Component\Routing\RequestContext;
18+
use Symfony\Component\Routing\Matcher\Dumper\DumperCollection;
1819

1920
class PhpGeneratorDumperTest extends \PHPUnit_Framework_TestCase
2021
{

0 commit comments

Comments
 (0)
0