Dieses Paket bietet eine Eigenschaft, die beim Speichern eines Eloquent-Modells einen einzigartigen Slug generiert.
$model = new EloquentModel();$model->name = 'activerecord ist großartig';$model->save();echo $model->slug; // gibt „activerecord-is-awesome“ aus
Die Slugs werden mit Str::slug
-Methode von Laravel generiert, wobei Leerzeichen in „-“ umgewandelt werden.
Spatie ist eine Webdesign-Agentur mit Sitz in Antwerpen, Belgien. Eine Übersicht aller unserer Open-Source-Projekte finden Sie auf unserer Website.
Wir investieren viele Ressourcen in die Erstellung erstklassiger Open-Source-Pakete. Sie können uns unterstützen, indem Sie eines unserer kostenpflichtigen Produkte kaufen.
Wir freuen uns sehr, dass Sie uns eine Postkarte aus Ihrer Heimatstadt schicken und erwähnen, welches unserer Pakete Sie verwenden. Unsere Adresse finden Sie auf unserer Kontaktseite. Wir veröffentlichen alle erhaltenen Postkarten auf unserer virtuellen Postkartenwand.
Sie können das Paket über Composer installieren:
Komponist benötigt Spatie/Laravel-Sluggable
Ihre Eloquent-Modelle sollten das Merkmal SpatieSluggableHasSlug
und die Klasse SpatieSluggableSlugOptions
verwenden.
Das Trait enthält eine abstrakte Methode getSlugOptions()
die Sie selbst implementieren müssen.
Die Migrationen Ihrer Modelle sollten über ein Feld verfügen, in dem der generierte Slug gespeichert werden kann.
Hier ist ein Beispiel für die Implementierung des Merkmals:
Namespace App;SpatieSluggableHasSlug verwenden;SpatieSluggableSlugOptions verwenden;IlluminateDatabaseEloquentModel verwenden;Klasse YourEloquentModel erweitert Model {use HasSlug;/** * Ruft die Optionen zum Generieren des Slugs ab. */public function getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug'); } }
Mit seiner Migration:
IlluminateDatabaseMigrationsMigration verwenden; IlluminateDatabaseSchemaBlueprint verwenden; IlluminateSupportFacadesSchema verwenden; Klasse CreateYourEloquentModelTable erweitert Migration {öffentliche Funktion up() { Schema::create('your_eloquent_models', function (Blueprint $table) {$table->increments('id');$table->string('slug'); // Feldname identisch mit Ihrem `saveSlugsTo`$table ->string('name');$table->timestamps(); }); } }
Um den generierten Slug in Routen zu verwenden, denken Sie daran, die implizite Routenmodellbindung von Laravel zu verwenden:
Namespace App;SpatieSluggableHasSlug verwenden;SpatieSluggableSlugOptions verwenden;IlluminateDatabaseEloquentModel verwenden;Klasse YourEloquentModel erweitert Model {use HasSlug;/** * Ruft die Optionen zum Generieren des Slugs ab. */public function getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug'); }/** * Ruft den Routenschlüssel für das Modell ab. * * @return string */public function getRouteKeyName() {return 'slug'; } }
Möchten Sie mehrere Felder als Grundlage für einen Slug verwenden? Kein Problem!
öffentliche Funktion getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom(['first_name', 'last_name']) ->saveSlugsTo('slug'); }
Sie können auch einen callable
an generateSlugsFrom
übergeben.
Standardmäßig generiert das Paket eindeutige Slugs, indem es „-“ und eine Zahl an einen bereits vorhandenen Slug anhängt.
Sie können dieses Verhalten deaktivieren, indem Sie allowDuplicateSlugs
aufrufen.
öffentliche Funktion getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug') ->allowDuplicateSlugs(); }
Sie können auch eine maximale Größenbeschränkung für den erstellten Slug festlegen:
öffentliche Funktion getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug') ->slugsShouldBeNoLongerThan(50); }
Der Slug kann aufgrund des Suffixes, das hinzugefügt wird, um ihn eindeutig zu machen, etwas länger als der angegebene Wert sein.
Sie können auch ein benutzerdefiniertes Trennzeichen verwenden, indem Sie usingSeparator
aufrufen
öffentliche Funktion getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug') ->usingSeparator('_'); }
Um die von Str::slug
verwendete Sprache festzulegen, können Sie usingLanguage
aufrufen
öffentliche Funktion getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug') ->usingLanguage('nl'); }
Sie können den generierten Slug auch überschreiben, indem Sie ihn einfach auf einen anderen Wert als den generierten Slug setzen.
$model = EloquentModel::create(['name' => 'mein Name']); //slug ist jetzt „my-name“;$model->slug = 'my-custom-url';$model->save(); //slug ist jetzt „my-custom-url“;
Wenn Sie den Slug nicht erstellen möchten, wenn das Modell einen Status hat, können Sie die Funktion skipGenerateWhen
verwenden.
öffentliche Funktion getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug') ->skipGenerateWhen(fn () => $this->state === 'draft'); }
Wenn Sie den Slug nicht beim ersten Erstellen des Modells erstellen möchten, können Sie die Funktion doNotGenerateSlugsOnCreate()
verwenden.
öffentliche Funktion getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug') ->doNotGenerateSlugsOnCreate(); }
Wenn Sie verhindern möchten, dass der Slug bei Modellaktualisierungen aktualisiert wird, rufen Sie ebenfalls doNotGenerateSlugsOnUpdate()
auf.
öffentliche Funktion getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug') ->doNotGenerateSlugsOnUpdate(); }
Dies kann hilfreich sein, um Permalinks zu erstellen, die sich erst ändern, wenn Sie dies ausdrücklich wünschen.
$model = EloquentModel::create(['name' => 'mein Name']); //slug ist jetzt „my-name“;$model->save();$model->name = 'changed name';$model->save(); //slug bleibt „mein-name“
Wenn Sie den Slug im Modell explizit aktualisieren möchten, können Sie jederzeit generateSlug()
für Ihr Modell aufrufen, um den Slug gemäß Ihren anderen Optionen zu erstellen. Vergessen Sie nicht, das Modell zu save()
um die Aktualisierung in Ihrer Datenbank beizubehalten.
Sie können verhindern, dass Slugs überschrieben werden.
öffentliche Funktion getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug') ->preventOverwrite(); }
Wenn Sie einen globalen Bereich haben, der berücksichtigt werden soll, können Sie diesen ebenfalls mit extraScope
definieren. Wenn Sie beispielsweise eine Seitentabelle haben, die Seiten mehrerer Websites enthält und jede Website ihre eigenen eindeutigen Slugs hat.
öffentliche Funktion getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug') ->extraScope(fn ($builder) => $builder->where('scope_id', $this->scope_id)); }
Standardmäßig beginnt der Suffixindex bei 1, Sie können die Startnummer festlegen.
öffentliche Funktion getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug') ->startSlugSuffixFrom(2); }
Sie können dieses Paket zusammen mit laravel-translatable verwenden, um für jedes Gebietsschema einen Slug zu generieren. Anstatt das Merkmal HasSlug
zu verwenden, müssen Sie das Merkmal HasTranslatableSlug
verwenden und den Namen des Slug-Felds zum Array $translatable
hinzufügen. Für Slugs, die aus einem einzelnen Feld oder mehreren Feldern generiert werden, müssen Sie nichts weiter ändern.
Namespace App;SpatieSluggableHasTranslatableSlug verwenden;SpatieSluggableSlugOptions verwenden;SpatieTranslatableHasTranslations verwenden;IlluminateDatabaseEloquentModel verwenden;Klasse YourEloquentModel erweitert Model {use HasTranslations, HasTranslatableSlug;public $translatable = ['name', 'slug'];/** * Rufen Sie die Optionen zum Generieren des Slugs ab. */public function getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug'); } }
Für Slugs, die aus einem Callable generiert werden, müssen Sie die SlugOptions
mit der Methode createWithLocales
instanziieren. Das Callable benötigt jetzt zwei Argumente statt eines. Sowohl das $model
als auch das $locale
stehen zur Generierung eines Slugs zur Verfügung.
Namespace App;SpatieSluggableHasTranslatableSlug verwenden;SpatieSluggableSlugOptions verwenden;SpatieTranslatableHasTranslations verwenden;IlluminateDatabaseEloquentModel verwenden;Klasse YourEloquentModel erweitert Model {use HasTranslations, HasTranslatableSlug;public $translatable = ['name', 'slug'];/** * Rufen Sie die Optionen zum Generieren des Slugs ab. */public function getSlugOptions() : SlugOptions{return SlugOptions::createWithLocales(['en', 'nl']) ->generateSlugsFrom(function($model, $locale) {return "{$locale} {$model->id}"; }) ->saveSlugsTo('slug'); } }
Sie können auch die implizite Routenmodellbindung von Laravel in Ihrem Controller verwenden, um das Modell automatisch aufzulösen. Um diese Funktion zu verwenden, stellen Sie sicher, dass die Slug-Spalte mit dem routeNameKey
übereinstimmt.
Derzeit unterstützen nur einige Datenbanktypen JSON-Vorgänge. Weitere Informationen darüber, welche Datenbanken JSON unterstützen, finden Sie in den Laravel-Dokumenten.
Namespace App;SpatieSluggableHasSlug verwenden;SpatieSluggableSlugOptions verwenden;IlluminateDatabaseEloquentModel verwenden;Klasse YourEloquentModel erweitert Model {use HasTranslations, HasTranslatableSlug;public $translatable = ['name', 'slug'];/** * Rufen Sie die Optionen zum Generieren des Slugs ab. */public function getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug'); }/** * Ruft den Routenschlüssel für das Modell ab. * * @return string */public function getRouteKeyName() {return 'slug'; } }
Der Einfachheit halber können Sie den Alias findBySlug
verwenden, um ein Modell abzurufen. Die Abfrage vergleicht mit dem Feld, das beim Definieren von SlugOptions
an saveSlugsTo
übergeben wurde.
$model = Article::findBySlug('my-article');
findBySlug
akzeptiert auch einen zweiten Parameter $columns
genau wie die standardmäßige Eloquent- find
.
Weitere Informationen zu den letzten Änderungen finden Sie im CHANGELOG.
Komponistentest
Weitere Informationen finden Sie unter BEITRAGEN.
Wenn Sie einen Sicherheitsfehler gefunden haben, senden Sie bitte eine E-Mail an [email protected], anstatt den Issue-Tracker zu verwenden.
Freek Van der Herten
Alle Mitwirkenden
Die MIT-Lizenz (MIT). Weitere Informationen finden Sie in der Lizenzdatei.