Small update, make router dynamic with prefixes.
This commit is contained in:
@@ -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
|
||||
|
||||
+25
-15
@@ -1,7 +1,6 @@
|
||||
<?php declare(strict_types=1);
|
||||
// -----------------------------------------------------------------------------
|
||||
// Parse Request URI
|
||||
// Examples:
|
||||
// / => /
|
||||
// /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
|
||||
|
||||
Reference in New Issue
Block a user