diff --git a/VERSION b/VERSION index bbc05bc..d0bb26d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.2309.112008 +0.2309.112031 diff --git a/src/Http/HttpFx.php b/src/Http/HttpFx.php index 6310ffd..ff3d222 100644 --- a/src/Http/HttpFx.php +++ b/src/Http/HttpFx.php @@ -1,7 +1,7 @@ router->use($path, $handler); } + /** + * Merges another router with this one with possibility of changing its root. + * + * @param string $path Base path to use. + * @param Router $router Router object to inherit from. + */ + public function merge(string $path, Router $router): void { + $this->router->merge($path, $router); + } + /** * Adds a new route. * diff --git a/src/Http/HttpRequest.php b/src/Http/HttpRequest.php index 7ffb165..ec7c7d4 100644 --- a/src/Http/HttpRequest.php +++ b/src/Http/HttpRequest.php @@ -1,12 +1,11 @@ setHttpVersion(new Version(...array_map('intval', explode('.', substr($_SERVER['SERVER_PROTOCOL'], 5))))); $build->setMethod($_SERVER['REQUEST_METHOD']); - - // this currently doesn't "properly" support the scenario where a full url is specified in the http request - $path = $_SERVER['REQUEST_URI']; - $pathQueryOffset = strpos($path, '?'); - if($pathQueryOffset !== false) - $path = substr($path, 0, $pathQueryOffset); - else { - $pathHashOffset = strpos($path, '#'); - if($pathHashOffset !== false) - $path = substr($path, 0, $pathHashOffset); - } - - if(!str_starts_with($path, '/')) - $path = '/' . $path; - - $build->setPath($path); + $build->setPath('/' . trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/')); $build->setParams($_GET); $build->setCookies($_COOKIE); diff --git a/src/Routing/IRouter.php b/src/Routing/IRouter.php index c9323c7..3f98e04 100644 --- a/src/Routing/IRouter.php +++ b/src/Routing/IRouter.php @@ -1,7 +1,7 @@ method = null; diff --git a/src/Routing/RouteInfo.php b/src/Routing/RouteInfo.php index d1daa63..4f7dc41 100644 --- a/src/Routing/RouteInfo.php +++ b/src/Routing/RouteInfo.php @@ -1,7 +1,7 @@ children = array_merge($this->children, $route->children); + $this->methods = array_merge($this->methods, $route->methods); + $this->middlewares = array_merge($this->middlewares, $route->middlewares); + if($this->dynamicChild === null) + $this->dynamicChild = $route->dynamicChild; + return; + } + + $this->getChild($path, $next)->mergeRoute($next, $route); + } + /** * @internal */ diff --git a/src/Routing/Router.php b/src/Routing/Router.php index 9ca7549..da91848 100644 --- a/src/Routing/Router.php +++ b/src/Routing/Router.php @@ -1,7 +1,7 @@ route->resolve($method, $path, $args); + return $this->route->resolve($method, trim($path, '/'), $args); } /** @@ -43,7 +43,17 @@ class Router implements IRouter { * @param callable $handler Middleware function. */ public function use(string $path, callable $handler): void { - $this->route->addMiddleware($path, $handler); + $this->route->addMiddleware(trim($path, '/'), $handler); + } + + /** + * Merges another router with this one with possibility of changing its root. + * + * @param string $path Base path to use. + * @param Router $router Router object to inherit from. + */ + public function merge(string $path, Router $router): void { + $this->route->mergeRoute(trim($path, '/'), $router->route); } /** @@ -57,7 +67,7 @@ class Router implements IRouter { if(empty($method)) throw new InvalidArgumentException('$method may not be empty.'); - $this->route->addMethod($method, $path, $handler); + $this->route->addMethod($method, trim($path, '/'), $handler); } /** diff --git a/tests/RouterTest.php b/tests/RouterTest.php index f88f3fb..3e047f3 100644 --- a/tests/RouterTest.php +++ b/tests/RouterTest.php @@ -1,7 +1,7 @@ assertEquals(['meow', 'rules page'], $router2->resolve('GET', '/rules')->runAll()); + + $router1->merge('/info', $router2); + + $this->assertEquals(['warioware', 'meow', 'rules page'], $router1->resolve('GET', '/info/rules')->runAll()); + $this->assertEquals(['meow', 'numeric test'], $router2->resolve('GET', '/25252')->runAll()); $router3 = new Router;