# Routing

## Frontend routing

Frontend routing verloopt via `cms/router.php` (PHP dev server) of `.htaccess` (Apache). Beide zorgen voor clean URLs.

### PHP dev server

Start de server met:

```bash
php -S localhost:8080 cms/router.php
```

`cms/router.php` serveert:
- Schone URLs: `/nl/pagina` → `public/index.php?page=pagina&lang=nl`
- `themes/` assets
- `admin/assets/` assets
- `plugins/` assets

### Apache (live server)

`public/.htaccess` herschrijft URLs naar `public/index.php`. Asset URLs (`/themes/`, `/admin/assets/`, `/plugins/`) worden doorgestuurd naar `public/asset.php`.

`public/asset.php` serveert bestanden vanuit de juiste mappen met het juiste MIME-type:
- `/themes/<name>/assets/...` → `themes/<name>/assets/...`
- `/admin/assets/...` → `admin/theme/default/assets/...`
- `/plugins/<name>/assets/...` → `plugins/<name>/assets/...`

## Admin routing

Admin routing verloopt via `public/admin.php` met clean URLs:

```
/admin/dashboard   → ?route=dashboard
/admin/content     → ?route=content
/admin/plugins     → ?route=plugins
```

`cms/router.php` of `.htaccess` zet `/admin/<route>` om naar `?route=<route>`.

### Route access control (RBAC)

Elke route wordt gecontroleerd via `AdminAuth::hasPermission($route)`:
- `admin` rol heeft wildcard `*` toegang
- Andere rollen hebben een expliciete lijst van toegestane routes in `ROLE_PERMISSIONS`
- Onbevoegde routes geven een **403 error**

## Plugin admin routing

Systeem plugins kunnen admin routes registreren. Deze worden afgehandeld door `PluginManager::handleAdminRoute($route)`:

1. Systeem plugin registreert routes via `getAdminRoutes()`
2. `PluginManager::getAdminMenuItems()` verzamelt admin menu items via `getAdminMenu()`
3. Bij een admin request zoekt `PluginManager::handleAdminRoute($route)` een plugin die de route afhandelt
4. De plugin methode `handleAdminRoute($route)` rendert de pagina inhoud

```php
// PluginManager roept deze aan voor /admin/mijn-systeem
$plugin->handleAdminRoute('mijn-systeem');
```