Skip to content

Commit

Permalink
[Routing] added requirements checking when generating a route
Browse files Browse the repository at this point in the history
  • Loading branch information
fabpot committed Mar 10, 2010
1 parent 2bc47f1 commit 0d05db0
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 5 deletions.
Expand Up @@ -59,12 +59,13 @@ protected function addGenerator()

$variables = str_replace("\n", '', var_export($compiledRoute->getVariables(), true));
$defaults = str_replace("\n", '', var_export($route->getDefaults(), true));
$requirements = str_replace("\n", '', var_export($compiledRoute->getRequirements(), true));
$tokens = str_replace("\n", '', var_export($compiledRoute->getTokens(), true));

$methods[] = <<<EOF
protected function get{$name}RouteInfo()
{
return array($variables, array_merge(\$this->defaults, $defaults), $tokens);
return array($variables, array_merge(\$this->defaults, $defaults), $requirements, $tokens);
}
EOF
Expand All @@ -82,9 +83,9 @@ public function generate(\$name, array \$parameters, \$absolute = false)
throw new \InvalidArgumentException(sprintf('Route "%s" does not exist.', \$name));
}
list(\$variables, \$defaults, \$tokens) = \$this->\$method();
list(\$variables, \$defaults, \$requirements, \$tokens) = \$this->\$method();
return \$this->doGenerate(\$variables, \$defaults, \$tokens, \$parameters, \$name, \$absolute);
return \$this->doGenerate(\$variables, \$defaults, \$requirements, \$tokens, \$parameters, \$name, \$absolute);
}
$methods
Expand Down
10 changes: 8 additions & 2 deletions src/Symfony/Components/Routing/Generator/UrlGenerator.php
Expand Up @@ -64,10 +64,10 @@ public function generate($name, array $parameters, $absolute = false)
$this->cache[$name] = $route->compile();
}

return $this->doGenerate($this->cache[$name]->getVariables(), $route->getDefaults(), $this->cache[$name]->getTokens(), $parameters, $name, $absolute);
return $this->doGenerate($this->cache[$name]->getVariables(), $route->getDefaults(), $route->getRequirements(), $this->cache[$name]->getTokens(), $parameters, $name, $absolute);
}

protected function doGenerate($variables, $defaults, $tokens, $parameters, $name, $absolute)
protected function doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $absolute)
{
$defaults = array_merge($this->defaults, $defaults);
$tparams = array_merge($defaults, $parameters);
Expand All @@ -86,6 +86,12 @@ protected function doGenerate($variables, $defaults, $tokens, $parameters, $name
{
if (false === $optional || !isset($defaults[$token[3]]) || (isset($parameters[$token[3]]) && $parameters[$token[3]] != $defaults[$token[3]]))
{
// check requirement
if (isset($requirements[$token[3]]) && !preg_match('#^'.$requirements[$token[3]].'$#', $tparams[$token[3]]))
{
throw new \InvalidArgumentException(sprintf('Parameter "%s" for route "%s" must match "%s" ("%s" given).', $token[3], $name, $requirements[$token[3]], $tparams[$token[3]]));
}

$url = $token[1].urlencode($tparams[$token[3]]).$url;
$optional = false;
}
Expand Down

0 comments on commit 0d05db0

Please sign in to comment.