Генерация slug в сидере Laravel
Поле slug часто попадает
в URL: вместо /posts/15
адрес выглядит как
/posts/my-article.
В slug допустимы латиница,
цифры и дефисы - без пробелов
и спецсимволов. Случайная
строка из random
для этого не подходит:
в адресе не разобрать запись,
а при отладке непонятно,
какой пост открыт.
Класс Str умеет собирать
slug из обычного текста -
метод slug. Пробелы
заменяются дефисами,
кириллица переводится
в латиницу:
<?php
echo Str::slug('Hello World');
echo Str::slug('Привет мир');
?>
В сидере slug обычно берут из заголовка поста - тогда URL совпадает со смыслом записи. Вставим пост с таким slug:
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class DatabaseSeeder extends Seeder
{
public function run(): void
{
DB::table('posts')->insert([
'title' => 'Test post',
'slug' => Str::slug('Test post'),
'text' => Str::random(50),
]);
}
}
?>
Для тестовых данных заголовок
можно не придумывать: склеить
префикс и случайную часть,
как в уроке про конкатенацию,
и прогнать результат
через slug:
<?php
echo Str::slug('post-' . Str::random(6));
?>
Получится адрес вида
post-a1b2c3 - читаемый
префикс и уникальный хвост.
Выполним команду на вставку:
php artisan db:seed
Сделайте сидер, который добавит в базу пост с человекочитаемым slug.