Commit c959ea3f authored by Fabien Potencier's avatar Fabien Potencier

ensured that generated route names are unique (closes #215)

parent 397190d3
......@@ -185,7 +185,7 @@ class Controller
$this->isFrozen = true;
}
public function bindDefaultRouteName($prefix)
public function generateRouteName($prefix)
{
$requirements = $this->route->getRequirements();
$method = isset($requirements['_method']) ? $requirements['_method'] : '';
......@@ -194,6 +194,6 @@ class Controller
$routeName = str_replace(array('/', ':', '|', '-'), '_', $routeName);
$routeName = preg_replace('/[^a-z0-9A-Z_.]+/', '', $routeName);
$this->routeName = $routeName;
return $routeName;
}
}
......@@ -120,10 +120,14 @@ class ControllerCollection
$routes = new RouteCollection();
foreach ($this->controllers as $controller) {
if (!$controller->getRouteName()) {
$controller->bindDefaultRouteName($prefix);
if (!$name = $controller->getRouteName()) {
$name = $controller->generateRouteName($prefix);
while ($routes->get($name)) {
$name .= '_';
}
$controller->bind($name);
}
$routes->add($controller->getRouteName(), $controller->getRoute());
$routes->add($name, $controller->getRoute());
$controller->freeze();
}
......
......@@ -76,10 +76,22 @@ class ControllerCollectionTest extends \PHPUnit_Framework_TestCase
$controllers->add($mountedRootController);
$mainRootController = new Controller(new Route('/'));
$mainRootController->bindDefaultRouteName('main_');
$mainRootController->bind($mainRootController->generateRouteName('main_'));
$controllers->flush();
$this->assertNotEquals($mainRootController->getRouteName(), $mountedRootController->getRouteName());
}
public function testUniqueGeneratedRouteNames()
{
$controllers = new ControllerCollection();
$controllers->add(new Controller(new Route('/a-a')));
$controllers->add(new Controller(new Route('/a_a')));
$routes = $controllers->flush();
$this->assertCount(2, $routes->all());
$this->assertEquals(array('_a_a', '_a_a_'), array_keys($routes->all()));
}
}
......@@ -75,7 +75,7 @@ class ControllerTest extends \PHPUnit_Framework_TestCase
public function testDefaultRouteNameGeneration(Route $route, $expectedRouteName)
{
$controller = new Controller($route);
$controller->bindDefaultRouteName('');
$controller->bind($controller->generateRouteName(''));
$this->assertEquals($expectedRouteName, $controller->getRouteName());
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment