Ce package fournit un trait qui générera un slug unique lors de la sauvegarde d'un modèle Eloquent.
$model = new EloquentModel();$model->name = 'activerecord est génial';$model->save();echo $model->slug; // affiche "activerecord-is-awesome"
Les slugs sont générés avec la méthode Laravels Str::slug
, dans laquelle les espaces sont convertis en « - ».
Spatie est une agence de webdesign basée à Anvers, en Belgique. Vous trouverez un aperçu de tous nos projets open source sur notre site Internet.
Nous investissons beaucoup de ressources dans la création des meilleurs packages open source de leur catégorie. Vous pouvez nous soutenir en achetant l'un de nos produits payants.
Nous apprécions grandement que vous nous envoyiez une carte postale de votre ville natale, mentionnant le(s) forfait(s) que vous utilisez. Vous trouverez notre adresse sur notre page contact. Nous publions toutes les cartes postales reçues sur notre mur virtuel de cartes postales.
Vous pouvez installer le package via composer :
le compositeur nécessite spatie/laravel-sluggable
Vos modèles Eloquent doivent utiliser le trait SpatieSluggableHasSlug
et la classe SpatieSluggableSlugOptions
.
Le trait contient une méthode abstraite getSlugOptions()
que vous devez implémenter vous-même.
Les migrations de vos modèles doivent avoir un champ dans lequel enregistrer le slug généré.
Voici un exemple de la façon d'implémenter le trait :
application d'espace de noms ; utiliser SpatieSluggableHasSlug ; utiliser SpatieSluggableSlugOptions ; utiliser IlluminateDatabaseEloquentModel ; la classe YourEloquentModel étend le modèle {use HasSlug;/** * Obtenez les options pour générer le slug. */fonction publique getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('nom') ->saveSlugsTo('slug'); } }
Avec sa migration :
utiliser IlluminateDatabaseMigrationsMigration ; utiliser IlluminateDatabaseSchemaBlueprint ; utiliser IlluminateSupportFacadesSchema ; la classe CreateYourEloquentModelTable étend la migration {fonction publique up() { Schema::create('your_eloquent_models', function (Blueprint $table) {$table->increments('id');$table->string('slug'); // Nom du champ identique à votre `saveSlugsTo`$table ->string('name');$table->timestamps(); }); } }
Pour utiliser le slug généré dans les routes, n'oubliez pas d'utiliser la liaison de modèle de route implicite de Laravel :
application d'espace de noms ; utiliser SpatieSluggableHasSlug ; utiliser SpatieSluggableSlugOptions ; utiliser IlluminateDatabaseEloquentModel ; la classe YourEloquentModel étend le modèle {use HasSlug;/** * Obtenez les options pour générer le slug. */fonction publique getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('nom') ->saveSlugsTo('slug'); }/** * Obtenez la clé de route pour le modèle. * * @chaîne de retour */fonction publique getRouteKeyName() {retourne 'limace'; } }
Vous souhaitez utiliser plusieurs champs comme base pour un slug ? Aucun problème!
fonction publique getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom(['prénom', 'nom']) ->saveSlugsTo('slug'); }
Vous pouvez également transmettre un callable
à generateSlugsFrom
.
Par défaut, le package générera des slugs uniques en ajoutant « - » et un numéro à un slug qui existe déjà.
Vous pouvez désactiver ce comportement en appelant allowDuplicateSlugs
.
fonction publique getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('nom') ->saveSlugsTo('slug') ->allowDuplicateSlugs(); }
Vous pouvez également fixer une limite de taille maximale au slug créé :
fonction publique getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('nom') ->saveSlugsTo('slug') ->slugsShouldBeNoLongerThan(50); }
Le slug peut être légèrement plus long que la valeur spécifiée, en raison du suffixe qui est ajouté pour le rendre unique.
Vous pouvez également utiliser un séparateur personnalisé en appelant usingSeparator
fonction publique getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('nom') ->saveSlugsTo('slug') ->usingSeparator('_'); }
Pour définir la langue utilisée par Str::slug
vous pouvez appeler usingLanguage
fonction publique getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('nom') ->saveSlugsTo('slug') ->usingLanguage('nl'); }
Vous pouvez également remplacer le slug généré simplement en le définissant sur une autre valeur que le slug généré.
$model = EloquentModel::create(['name' => 'mon nom']); //slug est maintenant "mon-nom";$model->slug = 'my-custom-url';$model->save(); //slug est maintenant "mon-url-personnalisée" ;
Si vous ne souhaitez pas créer le slug lorsque le modèle a un état, vous pouvez utiliser la fonction skipGenerateWhen
.
fonction publique getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('nom') ->saveSlugsTo('slug') ->skipGenerateWhen(fn () => $this->state === 'draft'); }
Si vous ne souhaitez pas créer le slug lors de la création initiale du modèle, vous pouvez utiliser la fonction doNotGenerateSlugsOnCreate()
.
fonction publique getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('nom') ->saveSlugsTo('slug') ->doNotGenerateSlugsOnCreate(); }
De même, si vous souhaitez empêcher la mise à jour du slug lors des mises à jour du modèle, appelez doNotGenerateSlugsOnUpdate()
.
fonction publique getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('nom') ->saveSlugsTo('slug') ->doNotGenerateSlugsOnUpdate(); }
Cela peut être utile pour créer des permaliens qui ne changent que lorsque vous le souhaitez explicitement.
$model = EloquentModel::create(['name' => 'mon nom']); //slug est maintenant "mon-nom";$model->save();$model->name = 'changed name';$model->save(); //slug reste "mon nom"
Si vous souhaitez mettre à jour explicitement le slug sur le modèle, vous pouvez appeler generateSlug()
sur votre modèle à tout moment pour créer le slug selon vos autres options. N'oubliez pas de save()
le modèle pour conserver la mise à jour dans votre base de données.
Vous pouvez empêcher l’écrasement des slugs.
fonction publique getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('nom') ->saveSlugsTo('slug') ->empêcheOverwrite(); }
Si vous avez une portée globale à prendre en compte, vous pouvez également la définir avec extraScope
. Par exemple, si vous avez un tableau de pages contenant des pages de plusieurs sites Web et que chaque site Web possède ses propres slugs uniques.
fonction publique getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('nom') ->saveSlugsTo('slug') ->extraScope(fn ($builder) => $builder->where('scope_id', $this->scope_id)); }
Par défaut, l'index du suffixe commence à 1, vous pouvez définir le numéro de départ.
fonction publique getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('nom') ->saveSlugsTo('slug') ->startSlugSuffixFrom(2); }
Vous pouvez utiliser ce package avec laravel-translatable pour générer un slug pour chaque paramètre régional. Au lieu d'utiliser le trait HasSlug
, vous devez utiliser le trait HasTranslatableSlug
et ajouter le nom du champ slug au tableau $translatable
. Pour les slugs générés à partir d’un seul champ ou de plusieurs champs, vous n’avez rien d’autre à modifier.
application d'espace de noms; utilisez SpatieSluggableHasTranslatableSlug; utilisez SpatieSluggableSlugOptions; utilisez SpatieTranslatableHasTranslations; utilisez IlluminateDatabaseEloquentModel; la classe YourEloquentModel étend le modèle {use HasTranslations, HasTranslatableSlug;public $translatable = ['name', 'slug'];/** * Obtenez les options pour générer le slug. */fonction publique getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('nom') ->saveSlugsTo('slug'); } }
Pour les slugs générés à partir d’un appelable, vous devez instancier SlugOptions
avec la méthode createWithLocales
. Le callable prend désormais deux arguments au lieu d'un. Le $model
et le $locale
sont disponibles pour générer un slug.
application d'espace de noms ; utilisez SpatieSluggableHasTranslatableSlug ; utilisez SpatieSluggableSlugOptions ; utilisez SpatieTranslatableHasTranslations ; utilisez IlluminateDatabaseEloquentModel ; la classe YourEloquentModel étend le modèle {use HasTranslations, HasTranslatableSlug;public $translatable = ['name', 'slug'];/** * Obtenez les options pour générer le slug. */public function getSlugOptions() : SlugOptions{return SlugOptions::createWithLocales(['en', 'nl']) ->generateSlugsFrom(function($model, $locale) {return "{$locale} {$model->id}"; }) ->saveSlugsTo('slug'); } }
Vous pouvez également utiliser la liaison de modèle de route implicite Laravels à l'intérieur de votre contrôleur pour résoudre automatiquement le modèle. Pour utiliser cette fonctionnalité, assurez-vous que la colonne slug correspond à routeNameKey
.
Actuellement, seuls certains types de bases de données prennent en charge les opérations JSON. De plus amples informations sur les bases de données prenant en charge JSON peuvent être trouvées dans la documentation Laravel.
application d'espace de noms ; utiliser SpatieSluggableHasSlug ; utiliser SpatieSluggableSlugOptions ; utiliser IlluminateDatabaseEloquentModel ; la classe YourEloquentModel étend le modèle {use HasTranslations, HasTranslatableSlug;public $translatable = ['name', 'slug'];/** * Obtenez les options pour générer le slug. */fonction publique getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('nom') ->saveSlugsTo('slug'); }/** * Obtenez la clé de route pour le modèle. * * @chaîne de retour */fonction publique getRouteKeyName() {retourne 'limace'; } }
Pour plus de commodité, vous pouvez utiliser l'alias findBySlug
pour récupérer un modèle. La requête sera comparée au champ transmis à saveSlugsTo
lors de la définition de SlugOptions
.
$model = Article::findBySlug('mon-article');
findBySlug
accepte également un deuxième paramètre $columns
tout comme la méthode find
Eloquent par défaut.
Veuillez consulter CHANGELOG pour plus d'informations sur ce qui a changé récemment.
test de compositeur
Veuillez consulter CONTRIBUER pour plus de détails.
Si vous avez trouvé un bug concernant la sécurité, veuillez envoyer un mail à [email protected] au lieu d'utiliser le suivi des problèmes.
Freek Van der Herten
Tous les contributeurs
La licence MIT (MIT). Veuillez consulter le fichier de licence pour plus d'informations.