Str::slug() перетворює текст на фрагмент URL: транслітерує, переводить у нижній регістр і замінює все, крім літер і цифр, на роздільник.
Str::slug('Laravel 13 Framework'); // 'laravel-13-framework'
Сигнатура: Str::slug($title, $separator = '-', $language = 'en', $dictionary = ['@' => 'at']).
Третій параметр - мова транслітерації, і за замовчуванням це 'en'. Для кирилиці це дає результат за загальними правилами, а не за українськими:
Str::slug('Київ - столиця України'); // 'kiyiv-stolicia-ukrayini'
Str::slug('Київ - столиця України', '-', 'uk'); // 'kyyiv-stolytsia-ukrayiny'
Str::slug('Щастя й ґанок'); // 'shhastia-i-ganok'
Str::slug('Щастя й ґанок', '-', 'uk'); // 'shchastia-y-ganok'
З 'uk' використовується українська таблиця (щ → shch, и → y, ц → ts), близька до офіційної транслітерації.
Unicode-slug без транслітерації:
Str::slug('Привіт', '-', null); // 'привіт'
Браузери показують такі адреси нормально, але при копіюванні вони перетворюються на %D0%BF%D1%80... - для посилань у месенджерах і логах це незручно.
Практичні правила:
- обрати одну мову транслітерації й використовувати її скрізь - у моделі, у міграції даних, у тестах. Якщо частина slug-ів створена з
'en', а частина з'uk', той самий заголовок дасть різні адреси; - змінювати правила транслітерації на живому сайті - це зміна URL усіх сторінок. Потрібні 301-редиректи зі старих адрес, інакше втрачаються пошукові позиції й зовнішні посилання;
- slug не має змінюватися автоматично при редагуванні заголовка опублікованого матеріалу - з тієї самої причини;
- унікальність:
Str::slugне перевіряє базу. Дублікати треба обробляти окремо (суфікс-2, ідентифікатор у URL чи унікальний індекс у базі); $dictionaryзамінює символи до транслітерації:['@' => 'at', '&' => 'and'].
Str::transliterate() і Str::ascii() - те саме перетворення без заміни пробілів і нижнього регістру; ascii теж приймає мову другим параметром.