/**
  * Adds a route to the node tree.
  *
  * @param \Viserio\Routing\Generator\RouteTreeNode $node
  * @param \Viserio\Contracts\Routing\Route         $route
  * @param array                                    $segments
  * @param int                                      $segmentDepth
  * @param array                                    $parameterIndexNameMap
  */
 protected function addRouteToNode(RouteTreeNode $node, RouteContract $route, array $segments, int $segmentDepth, array $parameterIndexNameMap)
 {
     if (empty($segments)) {
         $node->getContents()->addRoute($route, $parameterIndexNameMap);
         return;
     }
     $childSegmentMatcher = $this->getMatcher(array_shift($segments), $parameterIndexNameMap);
     if ($node->getContents()->hasChildFor($childSegmentMatcher)) {
         $child = $node->getContents()->getChild($childSegmentMatcher);
     } else {
         $child = new RouteTreeNode([$segmentDepth => $childSegmentMatcher], empty($segments) ? new MatchedRouteDataMap() : new ChildrenNodeCollection());
         $node->getContents()->addChild($child);
     }
     $this->addRouteToNode($child, $route, $segments, $segmentDepth + 1, $parameterIndexNameMap);
 }
 /**
  * [optimizeNode description]
  *
  * @param RouteTreeNode $node
  *
  * @return RouteTreeNode
  */
 protected function optimizeNode(RouteTreeNode $node) : RouteTreeNode
 {
     $matchers = $node->getMatchers();
     $contents = $node->getContents();
     if ($node->isParentNode()) {
         $contents = $this->optimizeNodes($node->getContents());
         $children = $contents->getChildren();
         if (count($children) === 1) {
             $childNode = reset($children);
             $matchers = MatcherOptimizer::mergeMatchers($node->getMatchers(), $childNode->getMatchers());
             $contents = $childNode->getContents();
         }
     }
     $matchers = MatcherOptimizer::optimizeMatchers($matchers);
     return $node->update($matchers, $contents);
 }
Example #3
0
 public function testMatchedRouteDataMapOperations()
 {
     $node = new RouteTreeNode([$this->mock(AbstractMatcher::class)], new MatchedRouteDataMap());
     $node->getContents()->addRoute(new Route(['GET', 'POST'], '', null), []);
     $this->assertSame(['GET', 'POST', 'HEAD'], $node->getContents()->getAllowedHttpMethods());
     $this->assertEquals([[['GET', 'POST', 'HEAD'], [[], 'GET|POST|HEAD']]], $node->getContents()->getHttpMethodRouteDataMap());
     $node->getContents()->addRoute(new Route('PATCH', '', null), [0 => 'param']);
     $this->assertSame(['GET', 'POST', 'HEAD', 'PATCH'], $node->getContents()->getAllowedHttpMethods());
     $this->assertEquals([[['GET', 'POST', 'HEAD'], [[], 'GET|POST|HEAD']], [['PATCH'], [[0 => 'param'], 'PATCH']]], $node->getContents()->getHttpMethodRouteDataMap());
 }