Slugs machen die URLs Sprechender und damit auch SEO-(Freund)licher. Statt domain.de/posts/1 würde man mit domain.de/posts/mein-erster-blog-eintrag arbeiten. Um das in Laravel zu realisieren, bedient man sich in der Regel externer Bibliotheken. Einmal eine von Spartie und eine cviebrock.
Man kann es natürlich aber auch selber machen. Die Bibliotheken sind hier aber vorzuziehen. Weil es ist keine große Logik dahinter und man spart einfach Zeit.
Ich werde hier die Bibliothek eloquent-sluggable von cviebrock nehmen.
1. Schritt:
composer require cviebrock/eloquent-sluggable
2. Schritt
php artisan vendor:publish --provider="Cviebrock\EloquentSluggable\ServiceProvider"
3. Schritt
Wähle das entsprechende Model welches durch Slugs aufgerufen werden soll. In unserem Beispiel wäre es App\Models\Post.php (Laravel 8) und App\Post (Larvel < 8)
use Cviebrock\EloquentSluggable\Sluggable;
class Post extends Model
{
use Sluggable;
/**
* Return the sluggable configuration array for this model.
*
* @return array
*/
public function sluggable(): array
{
return [
'slug' => [
'source' => 'title'
]
];
}
}
In der Methode sluggable() definiert ihr was zu Slug gemacht werden soll. Bei Post (Artikeln) macht der Titel Sinn. Deshalb hier source => ‘title’.
So das war es auch fast schon. Ab jetzt werden beim Anlegen eines neuen Artikels der entsprechende Slug erzeugt und im Model mit abgespeichert. Falls ein Blog-Titel sich wiederholen sollte, würde das Sluggable das erkennen und mit einer Nummerierung hintern slug diesen eindeutig machen.
Um die Artikel jetzt auch mit Laravels Route-Model-Binding aufzurufen, müssen wir im Post Model die Methode
public function getRouteKeyName()
{
return 'slug';
}
hinzufügen.
Diese Laravel Methode gibt an, den slug statt die id des Models zu nutzen.