Lab / Laravel

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');
}

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