---
title: "Routing"
description: "Wie Nibiru URLs auf Controller, Aktionen und Parameter abbildet – einschließlich SEO-freundlicher URL-Formen."
---

Die Nibiru-Routing ist **konventionenbasiert** mit optionalen Regex-Routen aus der Datei `settings.<env>.ini` für besondere Fälle. Es gibt keine große Route-Datei, die gepflegt werden muss.

## Die Standardskonvention
```
/<controller>/<action>/<param1>/<param2>/...
```
Beispiele:

| URL | Controller | Action | $_REQUEST |
|---|---|---|---|
| `/` | `indexController` | (none) | — |
| `/products` | `productsController` | (none) | — |
| `/products/detail` | `productsController` | `detailAction` | — |
| `/products/detail/42` | `productsController` | `detailAction` | `id => 42` |
| `/users/edit/42` | `usersController` | `editAction` | `id => 42` |

Ohne ein `_action` laufen nur `navigationAction()` und `pageAction()`. Mit `_action` läuft die benannte Aktion dazwischen.

## SEO-URLs

Nibiru erkennt SEO-freundliche URLs automatisch ohne jegliche Konfiguration. Das Muster:
```
/<controller>/<slug>/<numeric-id>
```
Wenn der zweite Abschnitt **kein** Methodenname im Controller ist und der dritte Abschnitt numerisch ist, überarbeitet Nibiru die Anfrage intern zu:
```
/<controller>/detail/?id=<numeric-id>&slug=<slug>
```
Also eine URL wie `/maschine/marduk-gold-plating/42` erreicht `maschineController::detailAction()` mit `$_REQUEST['id'] === '42'` und `$_REQUEST['slug'] === 'marduk-gold-plating'`. Dies ist genau so, wie die Produktions-E-Commerce-Seite `prod.maschinen-stockert.de` saubere URLs ohne einen benutzerdefinierten Router erzeugt.

## Parameter lesen

Alles nach dem Aktionssegment wird zu einem `$_REQUEST`-Schlüssel gemäß der Position:
```php
// /users/edit/42  →  $_REQUEST['id'] = '42'
public function editAction() {
    $id = (int) ($_REQUEST['id'] ?? 0);
    // ...
}
```
Für nicht-numerische oder benannte Parameter bevorzugen Sie Abfragezeichenfolgen:
```
/users/search?q=marduk&page=2
```
## Benutzerdefinierte Routen über INI

Der Abschnitt `[NIBIRU_ROUTING]` in der Datei `settings.<env>.ini` ermöglicht es Ihnen, Regex-URL-Muster mit Controller/Aktion-Paaren und benannten Parametern zuzuordnen:
```ini
[NIBIRU_ROUTING]
; Map /api/v1/products/42 to apiController::productsAction with id=42
api.v1.products.pattern    = "^/api/v1/products/(\d+)$"
api.v1.products.controller = "api"
api.v1.products.action     = "products"
api.v1.products.params[]   = "id"
```
Wenn eine URL dem Muster entspricht, werden die Captured Groups den benannten `params[]` Schlüsseln (nach Reihenfolge) als `$_REQUEST` Einträge zugewiesen.

## Routen-Hilfsprogramme
```php
Router::getInstance()->currentPage();   // 'products'
Router::getInstance()->tplName();       // 'products'  (controller stem for templates)
Router::getInstance()->getController(); // alias for currentPage()
```
Diese sind nützlich innerhalb von Controllern und Templates:
```smarty
<a href="/products" class="{if Router::currentPage() == 'products'}active{/if}">
  Products
</a>
```
(In Smarty verwenden Sie ein Smarty-Plugin oder eine vordefinierte Variable; der Helper selbst ist für PHP.)

## Weiterleitung

Um auf Framework-Ebene umzuleiten (setzt die richtigen HTTP-Header und beendet das Skript):
```php
View::forwardTo('/login');
```
Für eine JSON-Antwort (setzt `Content-Type: application/json`):
```php
View::forwardToJsonHeader();
View::assign(['data' => ['ok' => true]]);
```
Dieses Muster wird von API-Endpunkten im Produktivumfeld stark verwendet – siehe den `apiController` in `data.maschinen-stockert.de`.

## Paginierung-URLs

Nibirus [Pagination](/core/pagination/) erwartet URLs der Form:
```
/<controller>/<action>/page/<N>
```
Die `Pageination`-Klasse analysiert den nachfolgenden `page/N`-Segment, daher ist jede Routenformatierung in Ordnung, die es beibehält.

## Nachfolgende Schrägstriche und Groß-/Kleinschreibung

URLs werden **groß- und kleinschreibungssensitiv** abgeglichen. `/Users/edit` und `/users/edit` greifen auf unterschiedliche Controller zu (der zweite existiert, der erste führt zu einem 404-Fehler). Nachfolgende Schrägstriche werden toleriert.

## Häufige Fallen

- **Aktionssprünge mit SEO-URL.** Wenn Sie eine Methode `aboutAction()` benennen und versuchen, `/products/about/42` als SEO-URL zu verwenden, wird die SEO-Umleitung *nicht* ausgelöst, da `about` eine bekannte Aktion ist. Wählen Sie Slug-Namen, die nicht mit Aktionsnamen kollidieren.
- **Aktion ohne `_action`.** Einfach tippen `/products/detail/` ruft **nicht** `detailAction()` auf — `_action` muss gesetzt sein. Der Dispatcher führt dies automatisch durch, wenn die URL mindestens zwei Segmente hat, aber eine abgeschnittene Abfragezeichenfolge nicht.
- **`index` ist der Stammcontroller.** `/` → `indexController`. Es gibt keine separate "Home"-Route.
