SLUGIFY
SLUGIFY formalise des slugs lisibles, stables, uniques dans leur portee et sans ambiguite. L'objectif est d'eviter les surprises SEO tout en gardant des regles coherentes entre les differentes entites du site.
Principe central. La base canonique des URLs reste en anglais ASCII. Les traductions n'alterent pas l'URL canonique ; elles peuvent exister pour l'affichage ou l'UX, mais pas pour redefinir la route de reference.
SLUGIFY prend tout son sens dans une page structuree par sections metier. Pour le cadre HTML, les zones fondamentales et le role du section#slug, voir README_SimpleSL_FINAL.html.
Objectifs
- Produire des slugs lisibles, stables et sans ambiguite.
- Unifier les regles entre news, pages, categories et links.
- Maintenir une base canonique ASCII, independante des variations locales.
Regles de base
Normalisation
- Minuscules uniquement, trim, espaces transformes en
-. - Apostrophes et ponctuation supprimees.
- Translitteration ASCII pour les locales fr, en, nl.
- Caracteres autorises :
a-z0-9-. - Sequences de tirets compactees, sans tiret en debut ou en fin.
- Longueur maximale :
96caracteres, avec troncature propre si necessaire.
Unicite et portee
| Entite | Portee | Note |
|---|---|---|
| News | Unique globalement | news.slug |
| Pages | Unique globalement | pages.slug, avec home reserve pour / |
| Categories | Arbre global + parent scoped | Unique via (parent_id, slug) et slug_path |
| Links | Unique globalement | Evolution possible si hierarchie future |
Slugs reserves
Ne peuvent pas etre utilises : admin, login, logout, api, assets, storage, out, news, links, page, sitemap, robots.
Immutabilite
- News et pages publiees : slug immuable, changement uniquement avec redirection 301 explicite.
- Brouillons : slug regenerable jusqu'a la publication.
Gestion des collisions
La strategie par defaut utilise des suffixes numeriques : slug, slug-2, slug-3, jusqu'a -99. En cas de collision extreme ou de slug trop court apres troncature, le systeme bascule vers slug-<shortid> en base36.
hello-world
hello-world-2
hello-world-3
hello-world-k4z9
Implementation Laravel
L'implementation repose sur un service central pour eviter toute logique ad hoc dispersee dans les formulaires, observers ou controleurs.
App\Services\SlugManager: normalisation, liste des reserves, unicite et generation finale.App\Support\SlugRules: helper de validation pour les FormRequests, avec regex, longueur max et scoping d'unicite.SlugManager::uniqueFor(): delegation de l'unicite selon la table et le scope metier.
regex:/^[a-z0-9]+(?:-[a-z0-9]+)*$/
max:96
slug_i18n pour les categories
La colonne JSON slug_i18n stocke des variantes de slug par locale sans toucher au canon. Exemple : { "fr": "actualites", "nl": "nieuws" } pour le canon news.
- Chaque valeur est normalisee selon les memes regles que le slug canonique.
- Les cles locales suivent
^[a-z]{2}(-[A-Z]{2})?$. - Le service
SlugI18nServiceunifie la normalisation et les acces.
Migration legacy vers canon
- Categories : abandon de l'unicite globale plate au profit de
(parent_id, slug)+slug_pathunique. - Pages, news et links : conservation des slugs existants avec verification des conflits avant import.
Arbre interne canonique
SLUGIFY s'articule aussi avec un arbre interne stable servant de colonne vertebrale aux modules, a la navigation et aux outils d'administration.
- La meme table
categoriesest utilisee, avectype="internal"pour marquer l'appartenance au tree interne. slug_pathetdepthsont calcules et maintenus automatiquement.SiteTreeServiceconstruit l'arbre complet depuis la racinesite/.- La page admin
/admin/treerend cet arbre en HTML SimpleSL.
Parametrage
internal.enabled
internal.root_slugs
I18n
- Le slug canonique reste en anglais et en ASCII uniquement.
- Les traductions peuvent exister cote contenu, UX ou redirections futures.
- Locales supportees :
fr,en,nl. - En l'absence de variante locale, le canon est reutilise.
Tests minimaux
| Cas | Entree | Sortie attendue |
|---|---|---|
| Translitteration | Elegance d'Oeuvre |
elegance-doeuvre |
| Ponctuation | Hello, World! |
hello-world |
| Compactage | A -- B |
a-b |
| Collision | Titre identique | slug, puis slug-2 |
| Reserve | admin |
Validation 422 |
Notes
- SLUGIFY alimente les routes Laravel comme
/news/{slug}et doit rester strict pour eviter les ambiguities. - Les index uniques et le rappel d'immuabilite apres publication restent documentes dans la DOCS technique interne.
Resume. SLUGIFY transforme le slug en identite canonique stable du systeme : une URL simple a lire, stricte a valider, et suffisamment robuste pour tenir dans le temps.