コード例 #1
0
    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(), '            '));
    }
コード例 #2
0
ファイル: PhpMatcherDumper.php プロジェクト: ymnl007/92five
 /**
  * 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;
 }