[Routing] disallow numeric named variables in pattern
because PHP raises an error for such subpatterns in PCRE and thus would break matching, e.g. '(?<123>.+)'.
This commit is contained in:
parent
c0673d77d0
commit
be28e56f4e
@ -23,8 +23,10 @@ class RouteCompiler implements RouteCompilerInterface
|
|||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*
|
*
|
||||||
* @throws \LogicException If a variable is referenced more than once or if a required variable
|
* @throws \LogicException If a variable is referenced more than once or if a required variable
|
||||||
* has a default value that doesn't meet its own requirement.
|
* has a default value that doesn't meet its own requirement.
|
||||||
|
* @throws \DomainException If a variable name is numeric because PHP raises an error for such
|
||||||
|
* subpatterns in PCRE and thus would break matching, e.g. "(?<123>.+)".
|
||||||
*/
|
*/
|
||||||
public function compile(Route $route)
|
public function compile(Route $route)
|
||||||
{
|
{
|
||||||
@ -57,6 +59,9 @@ class RouteCompiler implements RouteCompilerInterface
|
|||||||
|
|
||||||
$tokens[] = array('variable', $match[0][0][0], $regexp, $var);
|
$tokens[] = array('variable', $match[0][0][0], $regexp, $var);
|
||||||
|
|
||||||
|
if (is_numeric($var)) {
|
||||||
|
throw new \DomainException(sprintf('Variable name "%s" cannot be numeric in route pattern "%s". Please use a different name.', $var, $route->getPattern()));
|
||||||
|
}
|
||||||
if (in_array($var, $variables)) {
|
if (in_array($var, $variables)) {
|
||||||
throw new \LogicException(sprintf('Route pattern "%s" cannot reference variable name "%s" more than once.', $route->getPattern(), $var));
|
throw new \LogicException(sprintf('Route pattern "%s" cannot reference variable name "%s" more than once.', $route->getPattern(), $var));
|
||||||
}
|
}
|
||||||
|
@ -144,4 +144,23 @@ class RouteCompilerTest extends \PHPUnit_Framework_TestCase
|
|||||||
// irrelevant for both matching and generating URLs.
|
// irrelevant for both matching and generating URLs.
|
||||||
$route->compile();
|
$route->compile();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider getNumericVariableNames
|
||||||
|
* @expectedException \DomainException
|
||||||
|
*/
|
||||||
|
public function testRouteWithNumericVariableName($name)
|
||||||
|
{
|
||||||
|
$route = new Route('/{'. $name . '}');
|
||||||
|
$route->compile();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getNumericVariableNames()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
array('09'),
|
||||||
|
array('123'),
|
||||||
|
array('1e2')
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user