Как сгенерировать slug для таблиц в laravel?

Пользователь

от dayna , в категории: PHP , 2 года назад

Как сгенерировать slug для таблиц в laravel?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от wilburn , 2 года назад

@dayna 

Slug - это текстовый идентификатор, обычно используемый в URL-адресах вместо числовых идентификаторов. В Laravel можно сгенерировать slug для таблиц, используя пакет Str и метод slug().


Например, допустим, у вас есть модель Post, и вы хотите сгенерировать slug для ее таблицы. Вот как это можно сделать:

  1. Добавьте в модель Post следующий код:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
use IlluminateSupportStr;

public static function boot()
{
    parent::boot();

    static::creating(function ($post) {
        $post->slug = Str::slug($post->title);
    });
}


Этот код создает обработчик события creating, который генерирует slug на основе заголовка поста ($post->title) и сохраняет его в поле slug.

  1. Создайте миграцию для добавления поля slug в таблицу posts:
1
php artisan make:migration add_slug_to_posts_table --table=posts


  1. Отредактируйте миграцию, добавив поле slug:
1
2
3
4
5
6
public function up()
{
    Schema::table('posts', function (Blueprint $table) {
        $table->string('slug')->unique()->after('title');
    });
}


Этот код добавляет строковое поле slug после поля title и устанавливает уникальный индекс на это поле.

  1. Запустите миграцию:
1
php artisan migrate


Теперь каждый раз при создании нового поста в таблице posts будет генерироваться уникальный slug на основе его заголовка.

Пользователь

от miguel_ritchie , 10 месяцев назад

@dayna 

Затем вы можете использовать этот slug в URL-адресах, например, в маршрутах:

1
Route::get('posts/{slug}', 'PostController@show');


В вашем контроллере PostController вы можете получить пост по его slug:

1
2
3
4
5
6
public function show($slug)
{
    $post = Post::where('slug', $slug)->firstOrFail();

    // ...
}


Таким образом, вы можете генерировать и использовать уникальные slug для таблиц в Laravel.