diff --git a/README.md b/README.md index 7512a53..cbdc735 100755 --- a/README.md +++ b/README.md @@ -114,24 +114,81 @@ return [ ]; ``` -Routes beginning with: +## Route Prefixes -```text -api/ -``` +Routes can be mapped to different source directories using prefixes. -are loaded from: - -```text -src/api/ -``` - -Everything else is loaded from: +By default: ```text src/views/pages/ ``` +is used for normal pages. + +The router also supports configurable route prefixes: + +```php +$route_bases = [ + 'api/' => ROOT . '/src/api', +]; +``` + +Example: + +```php +'/api/users' => 'api/users.php', +``` + +loads: + +```text +src/api/users.php +``` + +while: + +```php +'/about' => 'about.php', +``` + +loads: + +```text +src/views/pages/about.php +``` + +### Adding A New Route Type + +Create a new directory: + +```text +src/docs/ +``` + +Then add a prefix: + +```php +$route_bases = [ + 'api/' => ROOT . '/src/api', + 'docs/' => ROOT . '/src/docs', +]; +``` + +Now: + +```php +'/docs/getting-started' => 'docs/getting-started.php', +``` + +will load: + +```text +src/docs/getting-started.php +``` + +No router changes required. + --- ## Adding A New Page diff --git a/src/router.php b/src/router.php index 93d49c4..fd1e543 100755 --- a/src/router.php +++ b/src/router.php @@ -1,7 +1,6 @@ / // /about => /about // /about/ => /about @@ -41,22 +40,34 @@ if ($route === null) { } // ----------------------------------------------------------------------------- -// Determine Base Directory -// -// Routes beginning with: -// api/ -// are loaded from: -// src/api/ -// Everything else is loaded from: +// Route Prefix Mapping +// Maps route prefixes to source directories. +// api/example.php -> src/api/example.php +// docs/intro.php -> src/docs/intro.php +// Everything else defaults to: // src/views/pages/ // ----------------------------------------------------------------------------- +$route_bases = [ + 'api/' => ROOT . '/src/api', + // 'docs/' => ROOT . '/src/docs', + // 'admin/' => ROOT . '/src/admin', +]; -if (str_starts_with($route, 'api/')) { - $base = realpath(ROOT . '/src/api'); - $file = substr($route, 4); -} else { - $base = realpath(ROOT . '/src/views/pages'); - $file = $route; +// ----------------------------------------------------------------------------- +// Default Location +// ----------------------------------------------------------------------------- +$base = realpath(ROOT . '/src/views/pages'); +$file = $route; + +// ----------------------------------------------------------------------------- +// Resolve Route Location +// ----------------------------------------------------------------------------- +foreach ($route_bases as $prefix => $path) { + if (str_starts_with($route, $prefix)) { + $base = realpath($path); + $file = substr( $route, strlen($prefix)); + break; + } } if ($base === false) { @@ -77,7 +88,6 @@ $real = realpath($base . '/' . $file); // ----------------------------------------------------------------------------- // Path Traversal Protection -// // Ensures the resolved file stays inside the expected base directory. // Examples blocked: // ../../etc/passwd