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

Skip to content

Commit 7c764ee

Browse files
committed
[Routing] added hostname matching support to UrlGenerator
1 parent 2c9a045 commit 7c764ee

File tree

3 files changed

+35
-5
lines changed

3 files changed

+35
-5
lines changed

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ private function generateDeclaredRoutes()
9191
$properties[] = $compiledRoute->getDefaults();
9292
$properties[] = $compiledRoute->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-
10000 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

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,14 +85,14 @@ public function generate($name, $parameters = array(), $absolute = false)
8585
// the Route has a cache of its own and is not recompiled as long as it does not get modified
8686
$compiledRoute = $route->compile();
8787

88-
return $this->doGenerate($compiledRoute->getVariables(), $route->getDefaults(), $route->getRequirements(), $compiledRoute->getTokens(), $parameters, $name, $absolute);
88+
return $this->doGenerate($compiledRoute->getVariables(), $route->getDefaults(), $route->getRequirements(), $compiledRoute->getTokens(), $parameters, $name, $absolute, $compiledRoute->getHostnameTokens());
8989
}
9090

9191
/**
9292
* @throws MissingMandatoryParametersException When route has some missing mandatory parameters
9393
* @throws InvalidParameterException When a parameter value is not correct
9494
*/
95-
protected function doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $absolute)
95+
protected function doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $absolute, $hostnameTokens)
9696
{
9797
$variables = array_flip($variables);
9898

@@ -133,6 +133,25 @@ protected function doGenerate($variables, $defaults, $requirements, $tokens, $pa
133133
$url = '/';
134134
}
135135

136+
if ($hostnameTokens) {
137+
$host = '';
138+
foreach ($hostnameTokens as $token) {
139+
if ('variable' === $token[0]) {
140+
if (in_array($tparams[$token[3]], array(null, '', false), true)) {
141+
// check requirement
142+
if ($tparams[$token[3]] && !preg_match('#^'.$token[2].'$#', $tparams[$token[3]])) {
143+
throw new InvalidParameterException(sprintf('Parameter "%s" for route "%s" must match "%s" ("%s" given).', $token[3], $name, $token[2], $tparams[$token[3]]));
144+
}
145+
}
146+
147+
$host = $token[1].$tparams[$token[3]].$host;
148+
149+
} elseif ('text' === $token[0]) {
150+
$host = $token[1].$host;
151+
}
152+
}
153+
}
154+
136155
// add a query string if needed
137156
$extra = array_diff_key($originParameters, $variables, $defaults);
138157
if ($extra && $query = http_build_query($extra)) {
@@ -148,15 +167,24 @@ protected function doGenerate($variables, $defaults, $requirements, $tokens, $pa
148167
$scheme = $req;
149168
}
150169

170+
if ($hostnameTokens) {
171+
$absolute = true;
172+
}
173+
151174
if ($absolute) {
175+
176+
if (!$hostnameTokens) {
177+
$host = $this->context->getHost();
178+
}
179+
152180
$port = '';
153181
if ('http' === $scheme && 80 != $this->context->getHttpPort()) {
154182
$port = ':'.$this->context->getHttpPort();
155183
} elseif ('https' === $scheme && 443 != $this->context->getHttpsPort()) {
156184
$port = ':'.$this->context->getHttpsPort();
157185
}
158186

159-
$url = $scheme.'://'.$this->context->getHost().$port.$url;
187+
$url = $scheme.'://'.$host.$port.$url;
160188
}
161189
}
162190

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

Lines changed: 1 addition & 0 deletions
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