diff --git a/src/SegmentRouter.php b/src/SegmentRouter.php index 5247c68..c22b63c 100644 --- a/src/SegmentRouter.php +++ b/src/SegmentRouter.php @@ -78,31 +78,33 @@ class SegmentRouter implements RouterInterface } // params will hold any dynamic segments we find - $params = []; - - // We'll split up the URI into segments and traverse the node tree - foreach (explode('/', trim($uri, '/')) as $segment) { - // if there is a node for this segment, move to it - if (isset($node[$segment])) { - $node = $node[$segment]; - continue; - } - - // if there is a dynamic segment, move to it and store the value - if (isset($node[':x'])) { - $params[] = $segment; - $node = $node[':x']; - continue; - } - - // if we can't find a node for this segment, return 404 - return ['code' => 404, 'handler' => null, 'params' => []]; - } + $params = array_reduce( + explode('/', trim($uri, '/')), + function ($carry, $segment) use (&$node) { + if (isset($node[$segment])) { + $node = $node[$segment]; + } elseif (isset($node[':x'])) { + $carry[] = $segment; + $node = $node[':x']; + } else { + throw new \Exception('404'); + } + return $carry; + }, + [] + ); // if we found a handler for the method, return it and any params. if not, return a 405 return isset($node[$method]) - ? ['code' => 200, 'handler' => $node[$method], 'params' => $params ?? []] - : ['code' => 405, 'handler' => null, 'params' => []]; + ? [ + 'code' => 200, + 'handler' => $node[$method], + 'params' => $params ?? []] + : [ + 'code' => 405, + 'handler' => null, + 'params' => [] + ]; } /**