Retour au blog
Générer des slugs uniques avec Laravel 11

Générer des slugs uniques avec Laravel 11

Sommaire

  1. Présentation
  2. Tutoriel vidéo
  3. Interface et Trait
  4. Conclusion

Présentation

Il est important de savoir générer des slugs uniques lorsque vous enregistrer des données. (posts, catégories, etc.)

Dans ce tutoriel, nous allons voir comment le faire proprement. Votre modèle pourra implémenter l’interface Sluggable et automatiquement les slugs seront persister en même temps que les autres attributs.

Tutoriel vidéo

Interface et Trait

L’interface Sluggable permettra de définir le strict minimum pour que n’importe quel modèle puisse signer un contrat propre pour la génération de ses slugs.

On évite ainsi de duppliquer trop de code tout en restant flexible.

interface Sluggable
{
    public function slugColumn(): string;

    public function slugAttribute(): string;

    public static function generateUniqueSlug(string $attribute): string;
}

Pour implémenter ces fonctions, nous allons conserver le code commun aux modèles et faire directement porter ceci dans un trait HasSlug.

trait HasSlug
{
    public function slugColumn(): string
    {
        return 'slug';
    }

    public static function generateUniqueSlug(string $attribute): string
    {
        $counter = 1;
        $slug = Str::slug($attribute);
        $originalSlug = $slug;

        while (self::where('slug', $slug)->exists()) {
            $slug = $originalSlug . '-' . $counter;
            $counter++;
        }

        return $slug;
    }

    protected static function bootHasSlug(): void
    {
        self::creating(function (Sluggable $model) {
            $model->{$model->slugColumn()} = static::generateUniqueSlug($model->{$model->slugAttribute()});
        });
    }
}

Et voilà !

Il ne nous reste plus qu’à définir l’attribut sur lequel se baser pour générer le slug.

Dans mon exemple, je vais ajouter ceci dans mon modèle Post pour me baser sur le titre.

class Post extends Model implements Sluggable
{
    use HasFactory;
    use HasSlug;

    public function slugAttribute(): string
    {
        return 'title';
    }
    
    ...
}

Conclusion

Vous savez maintenant comment générer facilement et proprement un slug pour vos modèles avec Laravel 11.

N’hésitez pas à me suivre et à vous abonner à Laravel Jutsu pour plus de contenu !