SLUGIFY

Source canonique : DOCS/06_FEATURES/SLUGIFY.md · specification des regles de slugs pour joyz.pro · Contexte structurel : README_SimpleSL_FINAL.html

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 : 96 caracteres, 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 SlugI18nService unifie la normalisation et les acces.

Migration legacy vers canon

  • Categories : abandon de l'unicite globale plate au profit de (parent_id, slug) + slug_path unique.
  • 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 categories est utilisee, avec type="internal" pour marquer l'appartenance au tree interne.
  • slug_path et depth sont calcules et maintenus automatiquement.
  • SiteTreeService construit l'arbre complet depuis la racine site/.
  • La page admin /admin/tree rend 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.