URL-urile prietenoase folosesc slug-uri derivate din titlu. Română introduce diacritice și coliziuni când două titluri diferite se transliterează identic. Întrebarea explorează generarea, unicitatea în DB și politica de redirect când editorul schimbă titlul, astfel încât link-urile partajate să rămână valide sau să fie înlocuite explicit.
Helperul `Str::slug` transliterează și înlocuiește spațiile; verifică dacă păstrezi sau elimini diacriticele conform SEO dorit. Unele proiecte păstrează `ăâîșț` în URL dacă serverul și copy-link tratează encoding corect. Limita lungimii evită URL-uri fragmențate în clienti email. Caracterele interzise în path (`?`, `#`) trebuie eliminate înainte de salvare; validarea la input previne erori 400 la routare.
La creare, verifică existența slug-ului și adaugă sufix `-2`, `-3` sau hash scurt. Unique index pe coloană garantează integritatea sub concurență — prinde excepția și regenerează, nu te baza doar pe check-then-insert. Slug-ul poate rămâne stabil chiar dacă titlul se editează, ca să nu rupi link-uri externe. Observer Eloquent poate centraliza generarea, dar păstrează idempotenta la update parțial (doar body schimbat).
Ruta `{thread:slug}` rezolvă modelul după coloană non-id dacă configurezi getRouteKeyName. 404 apare când slug vechi nu mai există — păstrează tabel de redirect sau coloană `previous_slug` dacă politica e să actualizezi slug la rename. Cache-ul rutelor nu afectează binding-ul, dar schimbările de nume de parametri cer `route:clear`. Scope global pe model poate ascunde înregistrări draft — binding-ul returnează 404 corect, nu leak de conținut nepublicat.
Slug-ul nu înlocuiește titlul vizibil în pagină; motoarele folosesc conținutul real. Evită schimbări frecvente de slug fără redirect 301. Pentru categorii, slug-uri scurte și stabile bat titluri marketing schimbătoare. Liste alfabetice pe slug transliterat pot diferi de sortarea după titlul afișat — documentează alegerea pentru moderatori.
Generare și normalizare
Helperul `Str::slug` transliterează și înlocuiește spațiile; verifică dacă păstrezi sau elimini diacriticele conform SEO dorit. Unele proiecte păstrează `ăâîșț` în URL dacă serverul și copy-link tratează encoding corect. Limita lungimii evită URL-uri fragmențate în clienti email. Caracterele interzise în path (`?`, `#`) trebuie eliminate înainte de salvare; validarea la input previne erori 400 la routare.
Unicitate la inserare
La creare, verifică existența slug-ului și adaugă sufix `-2`, `-3` sau hash scurt. Unique index pe coloană garantează integritatea sub concurență — prinde excepția și regenerează, nu te baza doar pe check-then-insert. Slug-ul poate rămâne stabil chiar dacă titlul se editează, ca să nu rupi link-uri externe. Observer Eloquent poate centraliza generarea, dar păstrează idempotenta la update parțial (doar body schimbat).
Rute și model binding
Ruta `{thread:slug}` rezolvă modelul după coloană non-id dacă configurezi getRouteKeyName. 404 apare când slug vechi nu mai există — păstrează tabel de redirect sau coloană `previous_slug` dacă politica e să actualizezi slug la rename. Cache-ul rutelor nu afectează binding-ul, dar schimbările de nume de parametri cer `route:clear`. Scope global pe model poate ascunde înregistrări draft — binding-ul returnează 404 corect, nu leak de conținut nepublicat.
Căutare și indexare externă
Slug-ul nu înlocuiește titlul vizibil în pagină; motoarele folosesc conținutul real. Evită schimbări frecvente de slug fără redirect 301. Pentru categorii, slug-uri scurte și stabile bat titluri marketing schimbătoare. Liste alfabetice pe slug transliterat pot diferi de sortarea după titlul afișat — documentează alegerea pentru moderatori.