Aller au contenu
Nibiru docsv0.9.2

**Routing**

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).

Stable Reading time ~ 3 min Edit on GitHub

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.

/<controller>/<action>/<param1>/<param2>/...

Exemples :

URLContrôleurAction$_REQUEST
/indexController(aucune)
/produitsproductsController(aucune)
/produits/detailproductsControllerdetailAction
/produits/detail/42productsControllerdetailActionid => 42
/utilisateurs/modifier/42usersControllereditActionid => 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.

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é.

Tout ce qui se trouve après le segment d’action devient une clé $_REQUEST par position :

// /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

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 :

[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.

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 :

<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.)

Pour rediriger au niveau du framework (définit les en-têtes HTTP appropriés et quitte) :

View::forwardTo('/login');

Pour une réponse JSON (définit Content-Type: application/json) :

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.

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.

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.

  • 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.