Автогенерация слага для модели Laravel: методы и примеры кода

Автогенерация слага для модели 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(). Мы также обрабатываем повторяющиеся пули, добавляя к ним числовой суффикс, если он уже существует в базе данных.