---
title: "**Routing**"
description: "Comment Nibiru mappe les URL aux contrôleurs, actions et paramètres — y compris les formes d'URL amicales pour le référencement (SEO)."
---

Le routage de Nibiru est basé sur une **convention** avec des itinéraires regex optionnels à partir de `settings.<env>.ini` pour les cas spéciaux. Il n'y a pas de grand fichier de routes à maintenir.

## La convention par défaut
```
/<controller>/<action>/<param1>/<param2>/...
```
Exemples :

| URL | Contrôleur | Action | $_REQUEST |
|---|---|---|---|
| `/` | `indexController` | (aucune) | — |
| `/produits` | `productsController` | (aucune) | — |
| `/produits/detail` | `productsController` | `detailAction` | — |
| `/produits/detail/42` | `productsController` | `detailAction` | `id => 42` |
| `/utilisateurs/modifier/42` | `usersController` | `editAction` | `id => 42` |

Sans un `_action`, seules les méthodes `navigationAction()` et `pageAction()` sont exécutées. Avec un `_action`, l'action nommée s'exécute entre elles.

## SEO URLs

Nibiru détecte automatiquement les URL amicales pour le référencement sans aucune configuration. Le modèle :
```
/<controller>/<slug>/<numeric-id>
```
Si le deuxième segment **n'est pas** un nom de méthode sur le contrôleur et que le troisième segment est numérique, Nibiru réécrit la requête en interne par :
```
/<controller>/detail/?id=<numeric-id>&slug=<slug>
```
Donc une URL comme `/maschine/marduk-gold-plating/42` atteint `maschineController::detailAction()` avec `$_REQUEST['id'] === '42'` et `$_REQUEST['slug'] === 'marduk-gold-plating'`. C'est exactement comment le site e-commerce de production `prod.maschinen-stockert.de` produit des URL propres sans un routeur personnalisé.

## Lecture des paramètres

Tout ce qui se trouve après le segment d'action devient une clé `$_REQUEST` par position :
```php
// /users/edit/42  →  $_REQUEST['id'] = '42'
public function editAction() {
    $id = (int) ($_REQUEST['id'] ?? 0);
    // ...
}
```
Pour les paramètres non numériques ou nommés, privilégiez les chaînes de requête :
```
/users/search?q=marduk&page=2
```
## Routes personnalisées via INI

La section `[NIBIRU_ROUTING]` dans `settings.<env>.ini` vous permet de mapper des modèles d'URL en expressions régulières aux paires contrôleur/action et aux paramètres nommés :
```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"
```
Lorsqu'une URL correspond au modèle, les groupes capturés sont attribués aux clés nommées `params[]` (dans l'ordre) en tant qu'entrées `$_REQUEST`.

## Aide aux routages
```php
Router::getInstance()->currentPage();   // 'products'
Router::getInstance()->tplName();       // 'products'  (controller stem for templates)
Router::getInstance()->getController(); // alias for currentPage()
```
Ces éléments sont utiles dans les contrôleurs et les modèles :
```smarty
<a href="/products" class="{if Router::currentPage() == 'products'}active{/if}">
  Products
</a>
```
(Dans Smarty, vous utiliseriez un plugin Smarty ou une variable pré-affectée ; l'assistant lui-même est pour PHP.)

## Renvoi

Pour rediriger au niveau du framework (définit les en-têtes HTTP appropriés et quitte) :
```php
View::forwardTo('/login');
```
Pour une réponse JSON (définit `Content-Type: application/json`) :
```php
View::forwardToJsonHeader();
View::assign(['data' => ['ok' => true]]);
```
Ce modèle est utilisé intensivement par les points de terminaison de l'API en production — consultez le `apiController` dans `data.maschinen-stockert.de`.

## URL de pagination

La pagination de Nibiru attend des URL sous la forme :
```
/<controller>/<action>/page/<N>
```
La classe `Pageination` analyse le segment de fin `page/N`, donc n'importe quel format de route qui le préserve est acceptable.

## Barres obliques finales et casse

Les URL sont comparées de manière ** sensible à la casse **. `/Users/edit` et `/users/edit` cibleront des contrôleurs différents (le deuxième existe, le premier retourne une erreur 404). Les barres obliques de fin sont tolérées.

## Tracas courantes

- **Collision d'action avec l'URL SEO.** Si vous nommez une méthode `aboutAction()` et que vous essayez d'utiliser `/products/about/42` comme URL SEO, le réécriture SEO *ne se déclenchera pas*, car `about` est une action connue. Choisissez des slugs qui ne collident pas avec les noms d'action.
- **Action sans `_action`.** Taper simplement `/products/detail/` ne **n'appellera pas** `detailAction()` — `_action` doit être défini. Le dispatcheur le fait automatiquement lorsque l'URL a au moins deux segments, mais une chaîne de requête strippée ne le fera pas.
- **`index` est le contrôleur racine.** `/` → `indexController`. Il n'y a pas de route "accueil" distincte.
