Small update, make router dynamic with prefixes.
This commit is contained in:
@@ -114,24 +114,81 @@ return [
|
|||||||
];
|
];
|
||||||
```
|
```
|
||||||
|
|
||||||
Routes beginning with:
|
## Route Prefixes
|
||||||
|
|
||||||
```text
|
Routes can be mapped to different source directories using prefixes.
|
||||||
api/
|
|
||||||
```
|
|
||||||
|
|
||||||
are loaded from:
|
By default:
|
||||||
|
|
||||||
```text
|
|
||||||
src/api/
|
|
||||||
```
|
|
||||||
|
|
||||||
Everything else is loaded from:
|
|
||||||
|
|
||||||
```text
|
```text
|
||||||
src/views/pages/
|
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
|
## Adding A New Page
|
||||||
|
|||||||
+23
-13
@@ -1,7 +1,6 @@
|
|||||||
<?php declare(strict_types=1);
|
<?php declare(strict_types=1);
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// Parse Request URI
|
// Parse Request URI
|
||||||
// Examples:
|
|
||||||
// / => /
|
// / => /
|
||||||
// /about => /about
|
// /about => /about
|
||||||
// /about/ => /about
|
// /about/ => /about
|
||||||
@@ -41,22 +40,34 @@ if ($route === null) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// Determine Base Directory
|
// Route Prefix Mapping
|
||||||
//
|
// Maps route prefixes to source directories.
|
||||||
// Routes beginning with:
|
// api/example.php -> src/api/example.php
|
||||||
// api/
|
// docs/intro.php -> src/docs/intro.php
|
||||||
// are loaded from:
|
// Everything else defaults to:
|
||||||
// src/api/
|
|
||||||
// Everything else is loaded from:
|
|
||||||
// src/views/pages/
|
// 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');
|
// Default Location
|
||||||
$file = substr($route, 4);
|
// -----------------------------------------------------------------------------
|
||||||
} else {
|
|
||||||
$base = realpath(ROOT . '/src/views/pages');
|
$base = realpath(ROOT . '/src/views/pages');
|
||||||
$file = $route;
|
$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) {
|
if ($base === false) {
|
||||||
@@ -77,7 +88,6 @@ $real = realpath($base . '/' . $file);
|
|||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// Path Traversal Protection
|
// Path Traversal Protection
|
||||||
//
|
|
||||||
// Ensures the resolved file stays inside the expected base directory.
|
// Ensures the resolved file stays inside the expected base directory.
|
||||||
// Examples blocked:
|
// Examples blocked:
|
||||||
// ../../etc/passwd
|
// ../../etc/passwd
|
||||||
|
|||||||
Reference in New Issue
Block a user