ADR-029 : Convention de déclaration des routes (chemin et nom)¶
Statut¶
Accepté, Forge 1.0.0-beta.15 (ticket ROUTE-CONVENTION-ADR-029).
Remplace la convention implicite jusqu'ici portée par le générateur make:crud
(<ressource>_<action>, chemins REST) et le ticket
SKELETON-ROUTE-NAME-CONVENTION-001 (home_index).
Date¶
2026-06-08
Contexte¶
Les routes Forge étaient déclarées de façon hétérogène : le générateur
make:crud produit des noms <ressource>_<action> (underscore) avec des chemins
REST (/notes, /notes/{id}/edit), tandis que les parcours pédagogiques et le
squelette utilisaient des chemins et noms ad hoc. Aucune règle unique ne disait,
à partir d'un contrôleur et d'une méthode, quel chemin et quel nom une
route doit porter.
Le mainteneur fixe une convention mécanique et prévisible, dérivée du
contrôleur et de la méthode cibles, applicable aux starters (actuels et futurs),
au squelette, aux parcours welcome et au code généré par make:crud.
Décision¶
Une route Forge dérive mécaniquement du contrôleur et de la méthode qu'elle
vise.
Jetons¶
- Jeton contrôleur : nom de la classe sans le suffixe
Controller. - dans le chemin : en kebab-case (
WelcomeController→welcome,
UserProfileController→user-profile) ; - dans le nom : en snake_case (
welcome,user_profile). - Jeton méthode : nom de la méthode Python.
- dans le chemin : en kebab-case (
query_params→query-params) ; - dans le nom : tel quel, underscore conservé (
query_params).
Chemin (URL)¶
- Méthode
index: uniquement le jeton contrôleur (/welcome,/user-profile). - Toute autre méthode :
/<contrôleur>/<méthode>, suivi des paramètres de route
s'il y en a (/note/edit/{id}).
Nom (name=)¶
- Toujours
<contrôleur>-<méthode>, séparateur tiret (welcome-index,
welcome-query_params,note-edit).
Exemples¶
| Contrôleur.méthode | Chemin | name= |
|---|---|---|
WelcomeController.index |
/welcome |
welcome-index |
WelcomeController.query_params |
/welcome/query-params |
welcome-query_params |
NoteController.index |
/note |
note-index |
NoteController.edit (id) |
/note/edit/{id} |
note-edit |
ArticleController.create |
/article/create |
article-create |
Exception : la racine de l'application¶
Le point d'entrée de l'application reste la racine /. HomeController.index
est donc mappé sur / (et non /home), avec le nom home-index. C'est la
seule exception au « chemin = jeton contrôleur » pour un index.
Conséquences¶
Positives¶
- Une seule façon officielle de nommer et router (charte principe 11).
- Mapping bidirectionnel et mécanique : d'une URL on déduit le
contrôleur et la méthode, et inversement. Aide la lecture, la génération de
code et l'apprentissage. - L'index « nu » et le nom dérivé sont déjà l'intuition du générateur ; la
convention l'étend et la fige.
Limites / Risques¶
- Rupture franche avec la convention
make:crudactuelle (chemins REST,
noms underscore) et avechome_index. Pré-1.0, cette rupture se fait sans
alias ni guide de migration formel (phase bêta). - Les chemins sont singuliers (
/note,/article) et exposent le nom de
méthode (/note/edit/{id}) plutôt que la forme REST plurielle
(/notes/{id}/edit). C'est assumé : la prévisibilité prime ici sur la
convention REST. - Le nom mêle deux séparateurs (
welcome-query_params: tiret entre jetons,
underscore dans la méthode). C'est intentionnel et documenté.
Migration (tickets de suivi)¶
Cette convention est la cible. Sa mise en œuvre est livrée pour le périmètre
retenu par le mainteneur :
- Squelette :
home_indexdevienthome-index, racine/conservée.
Livré,ROUTE-CONVENTION-SKELETON-001(commit200548c). - Parcours welcome-forge (débutant, intermédiaire, avancé) : routes des
trois mini-projets réalignées. Livré,ROUTE-CONVENTION-WELCOME-001
(commita5a905c). - Générateur
make:crud: produit chemins/<contrôleur>/<méthode>et
noms<contrôleur>-<méthode>(index nu, racine exceptée). Livré,
ROUTE-CONVENTION-MAKECRUD-001(commit7082dfd), garde-fous mis à jour. - Parcours opt-in et starters restants : dé-scopé par le mainteneur
(juin 2026, « pour les starters on se cantonne à welcome-forge »). Les
parcours opt-in gardent transitoirement leur ancienne convention de route ;
divergence assumée, sans incidence surmake:crud(aucun starter opt-in
ne passe parkind=crud).
Alternatives écartées¶
A : Conserver la convention make:crud (REST, underscore)¶
Garder <ressource>_<action> et les chemins REST (/notes/{id}/edit). Écartée
par le mainteneur : la convention REST n'expose pas mécaniquement la méthode
cible, et le pluriel diverge du nom de contrôleur.
B : Aligner uniquement les starters sur make:crud¶
Laisser make:crud tel quel et n'aligner que les starters. Écartée : créerait
deux conventions parallèles (principe 11).
Référence¶
- Page de convention : Convention de route.
- Générateur concerné :
cli/entities/make_crud.py. - ADR-024 Bootstrap squelette dédié : ADR-024.
- Charte :
CHARTE_DOC.md(principe 11 ; règle C, dérogation bêta pré-1.0).