Skip to content

Commit 99b2c04

Browse files
[FrameworkBundle] [Routing] Check if default value matches requirement
1 parent 0bbbb01 commit 99b2c04

File tree

2 files changed

+30
-2
lines changed

2 files changed

+30
-2
lines changed

src/Symfony/Bundle/FrameworkBundle/Routing/Router.php

+13-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public function warmUp($cacheDir)
8686
*/
8787
private function resolveParameters(RouteCollection $collection)
8888
{
89-
foreach ($collection as $route) {
89+
foreach ($collection as $routeName => $route) {
9090
foreach ($route->getDefaults() as $name => $value) {
9191
$route->setDefault($name, $this->resolve($value));
9292
}
@@ -97,6 +97,18 @@ private function resolveParameters(RouteCollection $collection)
9797
}
9898

9999
$route->setRequirement($name, $this->resolve($value));
100+
$default = $route->getDefault($name);
101+
$requirement = $route->getRequirement($name);
102+
103+
if (null !== $default && 1 !== preg_match("#".$requirement."#", $default)) {
104+
throw new RuntimeException(sprintf(
105+
'Default value "%s" for "%s" does not match requirement "%s" in "%s" route.',
106+
$default,
107+
$name,
108+
$requirement,
109+
$routeName
110+
));
111+
}
100112
}
101113

102114
$route->setPath($this->resolve($route->getPath()));

src/Symfony/Bundle/FrameworkBundle/Tests/Routing/RouterTest.php

+17-1
Original file line numberDiff line numberDiff line change
@@ -185,13 +185,29 @@ public function testExceptionOnNonStringParameter()
185185
$router->getRouteCollection()->get('foo');
186186
}
187187

188+
/**
189+
* @expectedException \Symfony\Component\DependencyInjection\Exception\RuntimeException
190+
* @expectedExceptionMessage Default value "baz" for "bar" does not match requirement "\d+" in "foo" route.
191+
*/
192+
public function testExceptionOnDefaultValueNotMatchingRequirement()
193+
{
194+
$routes = new RouteCollection();
195+
$routes->add('foo', new Route('foo', array('bar' => 'baz'), array('bar' => '\d+')));
196+
197+
$sc = $this->getServiceContainer($routes);
198+
199+
$router = new Router($sc, 'foo');
200+
201+
$route = $router->getRouteCollection()->get('foo');
202+
}
203+
188204
/**
189205
* @dataProvider getNonStringValues
190206
*/
191207
public function testDefaultValuesAsNonStrings($value)
192208
{
193209
$routes = new RouteCollection();
194-
$routes->add('foo', new Route('foo', array('foo' => $value), array('foo' => '\d+')));
210+
$routes->add('foo', new Route('foo', array('foo' => $value)));
195211

196212
$sc = $this->getServiceContainer($routes);
197213

0 commit comments

Comments
 (0)