/** * 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); }
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()); }