Como criar slugs personalizadas direto do banco de dados com o laravel

Para criar slugs personalizadas diretamente do banco de dados no Laravel, você pode seguir os passos abaixo. Esses slugs geralmente são usados para criar URLs amigáveis com base em um campo (como o título de um post) e armazená-los no banco de dados.

Passo 1: Configurar o Banco de Dados

Adicione um campo slug na tabela onde deseja armazenar as slugs. Por exemplo, em uma tabela de posts:

Schema::table('posts', function (Blueprint $table) {
    $table->string('slug')->unique();
});

Passo 2: Instalar o Helper de Slugs (Opcional)

Você pode usar pacotes como o Laravel Sluggable para criar slugs automaticamente. Alternativamente, pode criar o código manualmente.

Instale o pacote Sluggable com Composer:

composer require spatie/laravel-sluggable

Passo 3: Configurar o Model

Se estiver usando o pacote, adicione a trait HasSlug e configure o método getSlugOptions no model. Exemplo:

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

class Post extends Model
{
    use HasSlug;

    public function getSlugOptions(): SlugOptions
    {
        return SlugOptions::create()
            ->generateSlugsFrom('title') // Campo usado para gerar o slug
            ->saveSlugsTo('slug');      // Campo onde o slug será salvo
    }
}

Se estiver criando o slug manualmente, adicione a lógica no método apropriado do modelo, como o evento saving ou creating.

Passo 4: Criar Slug Manualmente (Alternativa)

Você pode usar o helper Str::slug para criar slugs diretamente. Exemplo no evento creating:

use Illuminate\Support\Str;

class Post extends Model
{
    protected static function boot()
    {
        parent::boot();

        static::creating(function ($post) {
            if (empty($post->slug)) {
                $post->slug = Str::slug($post->title, '-'); // Gera o slug do título
            }
        });

        static::updating(function ($post) {
            if (empty($post->slug)) {
                $post->slug = Str::slug($post->title, '-');
            }
        });
    }
}

Passo 5: Salvar Slugs Durante a Migração de Dados

Se já existir conteúdo no banco de dados, você pode rodar um comando artisan ou um script para preencher os slugs existentes:

Artisan::command('generate:slugs', function () {
    $posts = \App\Models\Post::whereNull('slug')->get();

    foreach ($posts as $post) {
        $post->slug = Str::slug($post->title, '-');
        $post->save();
    }

    $this->info('Slugs geradas com sucesso!');
});

Passo 6: Usar as Slugs nas Rotas

Por fim, configure as rotas para usar as slugs:

Route::get('/posts/{slug}', [PostController::class, 'show'])->name('posts.show');

No controlador, recupere o post usando o slug:

public function show($slug)
{
    $post = Post::where('slug', $slug)->firstOrFail();
    return view('posts.show', compact('post'));
}

Com isso, você pode criar e gerenciar slugs personalizadas diretamente no banco de dados usando Laravel!

Posts Similares