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!