Heim  >  Artikel  >  Backend-Entwicklung  >  Schnecken mit einem ID-Fallback in Laravel

Schnecken mit einem ID-Fallback in Laravel

PHPz
PHPzOriginal
2024-07-31 02:35:12344Durchsuche

Slugs with an ID fallback in Laravel

Ursprünglich veröffentlicht auf meinem Blog, briandouglas.ie

Slugs lassen eine URL seriös aussehen. Niemand möchte auf einen Link klicken, der wie folgt lautet: https://mysite.com/blog/1. Ich würde definitiv gehackt werden, wenn ich darauf klicken würde. Aber was wäre, wenn dort https://mysite.com/blog/1/some-awesome-content zu lesen wäre? Das sieht jetzt vertrauenswürdig aus. Ich werde auf jeden Fall tolle Inhalte sehen, wenn ich auf diesen Link klicke.

Naiver Weg

Wie setzen wir es um? Nun, wir könnten den Titel der Blog-Ressource verwenden. Laravel bietet einen Str::slug-Helfer, der einen String nimmt und ihn sluggifiziert. Das bedeutet, dass „Mein toller Blog-Beitrag“ zu „mein toller Blog-Beitrag“ wird. Das scheint eine großartige Idee zu sein. Aktualisieren wir unser Blog-Modell, sodass es beim Speichern einen Slug-Wert basierend auf dem Titel festlegt.

use Illuminate\Support\Str;
use Illuminate\Database\Eloquent\Model;

class Blog extends Model
{
    protected static function boot()
    {
        parent::boot();

        static::saving(function ($model) {
            if (empty($model->slug)) {
                $model->slug = Str::slug($model->title);
            }
        });
    }
}

Jetzt können wir die Show-Route der Ressource wie folgt implementieren:

public function show(string $slug)
{
    return Blog::withSlug($slug)->first();
}

Super. Was für eine absolut narrensichere Implementierung.

Aber was ist, wenn wir den Titel aktualisieren?!?

Wenn der Titel aktualisiert wird, stimmt der Slug möglicherweise nicht mehr mit dem Inhalt überein.

Oder schlimmer noch, der Slug wird möglicherweise auch aktualisiert!

Dann gibt die vorherige URL einen 404-Fehler zurück, wodurch eingebettete Inhalte möglicherweise beschädigt werden.

Der intelligente Weg

Ja, also doch nicht narrensicher. Der Titel des Blogs kann sich ändern. Es ist also nicht etwas, worauf wir unsere URLs stützen wollen, denn wir wollen nicht, dass sich unsere URLs ändern.

Was sollte sich also an unserem Blog nicht ändern? es ist id. Am Anfang dieses Artikels zeigten wir eine hässliche URL https://mysite.com/blog/1. Das Gute an dieser hässlichen URL ist, dass sie sich nicht ändern sollte. Wenn Sie es besuchen, sehen Sie immer den Blog mit der ID 1. Der Nachteil ist, dass er nicht beschreibend ist. Kombinieren wir also die eindeutige Kennung der ID mit dem Slug, der auf dem Titel des Blogs basiert. Auf diese Weise erhalten wir eine URL wie folgt: https://mysite.com/blog/1/my-awesome-content. Der Trick dabei ist, dass der Slug-Teil der URL nur ästhetischen Zwecken dient. Es gibt dem Benutzer eine Vorstellung davon, worum es in dem Blog mit der ID 1 gehen könnte. Implementieren wir dies in Laravel, sodass die URL funktioniert, die ID jedoch ausschließlich zum Abrufen des Blogs verwendet und zum aktualisierten Slug weiterleitet, wenn sich der Titel ändert.

Der Kodex

Wir können das obige Szenario auf diese Weise erreichen. Zunächst geben wir in unserer Routendatei die folgende Showroute an.

Route::get('blog/{blog}/{slug?}', [BlogController::class, 'show'])->name('blog.show');

Jetzt aktualisieren wir unser Blog-Modell, um eine Hilfsmethode zu enthalten, die die neue Show-Route erstellt.

use Illuminate\Support\Str;
use Illuminate\Database\Eloquent\Model;

class Blog extends Model
{
    public function showRoute(array $parameters = [])
    {
        return route('blog.show', [$this, Str::slug($this->title), ...$parameters]);
    }
}

Schließlich werden wir in der Show-Methode unseres BlogControllers Folgendes hinzufügen.

public function show(Request $request, Blog $blog)
{
    if (! Str::contains($blog->showRoute(), $request->path())) {
        return redirect($blog->showRoute($request->query()), status: 301);
    }

    return view('blog.show', compact('blog'));
}

In der obigen Show-Methode wird die Routenmodellbindung von Laravel verwendet, um das richtige Blog basierend auf der angegebenen ID zu finden. Anschließend fügen wir eine zusätzliche Prüfung hinzu, um sicherzustellen, dass $request->path() mit showRoute() übereinstimmt. Wenn dies nicht der Fall ist, leiten wir zur richtigen showRoute() mit dem Status „301 Moved Permanently“ weiter, um dem Browser mitzuteilen, dass der Slug aktualisiert wurde.

Das obige ist der detaillierte Inhalt vonSchnecken mit einem ID-Fallback in Laravel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn