public function testMergeSlashNodes() { $coll = new DumperPrefixCollection(); $coll->setPrefix(''); $route = new DumperRoute('bar', new Route('/foo/bar')); $coll = $coll->addPrefixRoute($route); $route = new DumperRoute('bar2', new Route('/foo/bar')); $coll = $coll->addPrefixRoute($route); $route = new DumperRoute('qux', new Route('/foo/qux')); $coll = $coll->addPrefixRoute($route); $route = new DumperRoute('bar3', new Route('/foo/bar')); $result = $coll->addPrefixRoute($route); $result->getRoot()->mergeSlashNodes(); $expect = <<<'EOF' |-coll /f | |-coll /fo | | |-coll /foo | | | |-coll /foo/b | | | | |-coll /foo/ba | | | | | |-coll /foo/bar | | | | | | |-route bar /foo/bar | | | | | | |-route bar2 /foo/bar | | | |-coll /foo/q | | | | |-coll /foo/qu | | | | | |-coll /foo/qux | | | | | | |-route qux /foo/qux | | | |-coll /foo/b | | | | |-coll /foo/ba | | | | | |-coll /foo/bar | | | | | | |-route bar3 /foo/bar EOF; $this->assertSame($expect, $this->collectionToString($result->getRoot(), ' ')); }
/** * Organizes the routes into a prefix tree. * * Routes order is preserved such that traversing the tree will traverse the * routes in the origin order. * * @param DumperCollection $collection A collection of routes * * @return DumperPrefixCollection */ private function buildPrefixTree(DumperCollection $collection) { $tree = new DumperPrefixCollection(); $current = $tree; foreach ($collection as $route) { $current = $current->addPrefixRoute($route); } $tree->mergeSlashNodes(); return $tree; }
/** * Generates PHP code recursively to match a tree of routes. * * @param DumperPrefixCollection $collection A DumperPrefixCollection instance * @param bool $supportsRedirections Whether redirections are supported by the base class * @param string $parentPrefix Prefix of the parent collection * * @return string PHP code */ private function compilePrefixRoutes(DumperPrefixCollection $collection, $supportsRedirections, $parentPrefix = '') { $code = ''; $prefix = $collection->getPrefix(); $optimizable = 1 < strlen($prefix) && 1 < count($collection->all()); $optimizedPrefix = $parentPrefix; if ($optimizable) { $optimizedPrefix = $prefix; $code .= sprintf(" if (0 === strpos(\$pathinfo, %s)) {\n", var_export($prefix, true)); } foreach ($collection as $route) { if ($route instanceof DumperCollection) { $code .= $this->compilePrefixRoutes($route, $supportsRedirections, $optimizedPrefix); } else { $code .= $this->compileRoute($route->getRoute(), $route->getName(), $supportsRedirections, $optimizedPrefix) . "\n"; } } if ($optimizable) { $code .= " }\n\n"; // apply extra indention at each line (except empty ones) $code = preg_replace('/^.{2,}$/m', ' $0', $code); } return $code; }