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 ...@@ -185,7 +185,7 @@ class Controller
$this->isFrozen = true; $this->isFrozen = true;
} }
public function bindDefaultRouteName($prefix) public function generateRouteName($prefix)
{ {
$requirements = $this->route->getRequirements(); $requirements = $this->route->getRequirements();
$method = isset($requirements['_method']) ? $requirements['_method'] : ''; $method = isset($requirements['_method']) ? $requirements['_method'] : '';
...@@ -194,6 +194,6 @@ class Controller ...@@ -194,6 +194,6 @@ class Controller
$routeName = str_replace(array('/', ':', '|', '-'), '_', $routeName); $routeName = str_replace(array('/', ':', '|', '-'), '_', $routeName);
$routeName = preg_replace('/[^a-z0-9A-Z_.]+/', '', $routeName); $routeName = preg_replace('/[^a-z0-9A-Z_.]+/', '', $routeName);
$this->routeName = $routeName; return $routeName;
} }
} }
...@@ -120,10 +120,14 @@ class ControllerCollection ...@@ -120,10 +120,14 @@ class ControllerCollection
$routes = new RouteCollection(); $routes = new RouteCollection();
foreach ($this->controllers as $controller) { foreach ($this->controllers as $controller) {
if (!$controller->getRouteName()) { if (!$name = $controller->getRouteName()) {
$controller->bindDefaultRouteName($prefix); $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(); $controller->freeze();
} }
......
...@@ -76,10 +76,22 @@ class ControllerCollectionTest extends \PHPUnit_Framework_TestCase ...@@ -76,10 +76,22 @@ class ControllerCollectionTest extends \PHPUnit_Framework_TestCase
$controllers->add($mountedRootController); $controllers->add($mountedRootController);
$mainRootController = new Controller(new Route('/')); $mainRootController = new Controller(new Route('/'));
$mainRootController->bindDefaultRouteName('main_'); $mainRootController->bind($mainRootController->generateRouteName('main_'));
$controllers->flush(); $controllers->flush();
$this->assertNotEquals($mainRootController->getRouteName(), $mountedRootController->getRouteName()); $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 ...@@ -75,7 +75,7 @@ class ControllerTest extends \PHPUnit_Framework_TestCase
public function testDefaultRouteNameGeneration(Route $route, $expectedRouteName) public function testDefaultRouteNameGeneration(Route $route, $expectedRouteName)
{ {
$controller = new Controller($route); $controller = new Controller($route);
$controller->bindDefaultRouteName(''); $controller->bind($controller->generateRouteName(''));
$this->assertEquals($expectedRouteName, $controller->getRouteName()); $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