Laravel: Автоматическое создание уникальных URL адресов

В этой короткой заметке я расскажу как быстро и просто создавать уникальные тринслетирированные URL'ы в ваших проектах на Laravel.

Инструкция актуальна для Laravel 5.5 / 5.6 и выше. Для версий ниже прийдётся подключать сервис провайдер и алиас вручную.

В нашем туториале мы будем использовать библиотеку spatie/laravel-sluggable. Как работает данная библиотека? Добавляем метод use в вашу модель, при сохранении модели бибилиотеке скармливается параметр откуда берём имя, и в какую ячейку пишем url, затем она пробегается по вашей базе, и если там уде есть запись с идентичным урлом к патерну добавляеться -1 / -2 итд.

Итак для начала установим библиотеку генерации URL'ов:

composer require spatie/laravel-sluggable

Далее идём в вашу модель для которой мы будем генерировать url (например Post) и добавляем классы библиотеки:

use Spatie\Sluggable\HasSlug;
use Spatie\Sluggable\SlugOptions;

Затем добавляем вызов в модели:

use HasSlug;

и наконец прописываем параметры:

 public function getSlugOptions() : SlugOptions
    {
        return SlugOptions::create()
            ->generateSlugsFrom('title') // Откуда берём имя урла
            ->saveSlugsTo('url'); // в какое поле записываем
    }

Всё вместе будет выглядеть вот так:

<?php

namespace App;

use Spatie\Sluggable\HasSlug;
use Spatie\Sluggable\SlugOptions;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasSlug;
    
    /**
     * Параметры генерации URL.
     */
    public function getSlugOptions() : SlugOptions
    {
        return SlugOptions::create()
            ->generateSlugsFrom('title')
            ->saveSlugsTo('url');
    }
}

Хотите больше гибкости? Не проблема!

public function getSlugOptions() : SlugOptions
{
    return SlugOptions::create()
        ->generateSlugsFrom(['first_name', 'last_name'])
        ->saveSlugsTo('slug');
}

Ну я надеюсь вы поняли трюк =)