Laravel має два способи працювати з рядками, і обидва побудовані на тому самому наборі методів.
1. Статичний клас Str - кожен метод приймає рядок і повертає новий рядок:
use Illuminate\Support\Str;
Str::limit('Довгий текст статті', 10); // 'Довгий тек...'
Str::headline('laravel_framework'); // 'Laravel Framework'
Str::mask('olena@example.com', '*', 3); // 'ole**************'
Str::contains($title, ['Laravel', 'PHP']);
Str::uuid();
2. Fluent-рядки - Str::of() чи коротший хелпер str() повертають об'єкт Stringable, і методи можна складати в ланцюжок:
$slug = str(' Нова версія Laravel ')
->squish() // прибрати зайві пробіли
->limit(50, '')
->slug('-', 'uk');
Str::of($path)->afterLast('/')->beforeLast('.');
Між Str::of('...') і str('...') різниці немає: це той самий Stringable. А виклик str() без аргументів повертає об'єкт, що перенаправляє виклики до статичних методів Str: str()->uuid().
Коли що обирати:
| Ситуація | Що зручніше |
|---|---|
| одна операція | Str::limit($text, 100) |
| кілька перетворень поспіль | str($text)->squish()->lower()->... |
| умовні кроки | str($x)->when($cond, fn ($s) => $s->append('...')) |
Stringable - не рядок. Він приводиться до рядка в echo, Blade і конкатенації, але === з рядком дасть false, а функція з типом string у строгому режимі отримає об'єкт. Тому в кінці ланцюжка часто викликають ->toString() чи ->value():
$name = str($input)->trim()->title()->toString();
Кирилиця: методи Str враховують багатобайтові символи - str('Привіт')->length() повертає 6, а не 12, як strlen(). Але Str::slug() і Str::ascii() транслітерують за правилами мови, яку треба вказати явно, якщо результат має бути українською транслітерацією.
Перед тим як писати власну функцію для рядків варто переглянути список методів Str: там уже є between, excerpt, initials, wordCount, plural, squish, isUuid, isJson і десятки інших.