Автогенерация слага для модели Laravel
В Laravel слаг — это версия строки, удобная для URL-адресов, которая обычно используется для создания удобочитаемых URL-адресов, удобных для поисковых систем. При работе с моделями Laravel вам может потребоваться автоматически генерировать фрагменты на основе определенных атрибутов или полей. В этой статье мы рассмотрим несколько методов автоматического создания фрагментов для моделей Laravel, а также примеры кода.
Метод 1: использование вспомогательной функции Laravel Str::slug()
Функция Str::slug(), предоставляемая классом Str Laravel, позволяет нам легко генерировать пули. Вот пример того, как вы можете использовать его в своей модели Laravel:
use Illuminate\Support\Str;
class Article extends Model
{
public function setSlugAttribute($value)
{
$this->attributes['slug'] = Str::slug($value);
}
}
В этом примере у нас есть модель под названием «Статья» с атрибутом «slug». Метод «setSlugAttribute» — это метод доступа, который автоматически генерирует пул каждый раз, когда установлен атрибут «slug».
Метод 2: использование пакета Laravel Sluggable
Другой подход — использовать такой пакет, как «cviebrock/eloquent-sluggable», который обеспечивает удобный способ создания шаблонов для моделей Laravel. Вот пример:
use Cviebrock\EloquentSluggable\Sluggable;
class Article extends Model
{
use Sluggable;
public function sluggable(): array
{
return [
'slug' => [
'source' => 'title'
]
];
}
}
В этом примере мы используем пакет «cviebrock/eloquent-sluggable» и определяем метод «sluggable» в нашей модели. Мы указываем, что атрибут «slug» должен быть сгенерирован из атрибута «title».
Метод 3: использование пользовательской логики с помощью функции Laravel Str::slug()
Вы также можете реализовать собственную логику для создания фрагментов на основе ваших конкретных требований. Вот пример:
use Illuminate\Support\Str;
class Article extends Model
{
public function setSlugAttribute($value)
{
$slug = Str::slug($value);
// Custom logic to handle duplicate slugs
$count = :where('slug', 'like', $slug.'%')->count();
$this->attributes['slug'] = $count ? $slug.'-'.$count : $slug;
}
}
В этом примере мы генерируем пул с помощью функции Laravel Str::slug(). Мы также обрабатываем повторяющиеся пули, добавляя к ним числовой суффикс, если он уже существует в базе данных.