Slugs avec une solution de repli d'identification dans Laravel

PHPz
Libérer: 2024-07-31 02:35:12
original
343 Les gens l'ont consulté

Slugs with an ID fallback in Laravel

Publié à l'origine sur mon blog, briandouglas.ie

Les Slugs donnent à une URL une apparence légitime. Personne ne veut cliquer sur un lien qui ressemble à https://mysite.com/blog/1. Je serais certainement piraté si je cliquais dessus. Mais que se passe-t-il s'il lit https://mysite.com/blog/1/some-awesome-content. Maintenant, cela semble digne de confiance. Je vais certainement voir du contenu génial si je clique sur ce lien.

Manière naïve

Alors, comment pouvons-nous le mettre en œuvre ? Eh bien, nous pourrions utiliser le titre de la ressource du blog. Laravel fournit un assistant Str::slug qui prend une chaîne et la sluggifie. Cela signifie que mon article de blog génial devient mon article de blog génial. Cela semble être une excellente idée. Mettons à jour notre modèle de blog afin que lorsqu'il est enregistré, il définisse une valeur slug basée sur le titre.

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);
            }
        });
    }
}
Copier après la connexion

Nous pouvons maintenant implémenter l'itinéraire d'affichage de la ressource comme ceci :

public function show(string $slug)
{
    return Blog::withSlug($slug)->first();
}
Copier après la connexion

Génial. Quelle implémentation complètement infaillible.

Mais et si on mettait à jour le titre ?!?

Si le titre est mis à jour, le slug risque de ne plus correspondre au contenu.

Ou pire, le slug pourrait également se mettre à jour !

Ensuite, l'URL précédente renverra un 404, ce qui peut casser le contenu intégré.

La manière intelligente

Oui, donc pas infaillible finalement. Le titre du blog peut changer. Ce n'est donc pas quelque chose sur lequel nous voulons baser nos URL, car nous ne voulons pas que nos URL changent.

Alors qu'est-ce qui ne devrait pas changer sur notre blog ? c'est une pièce d'identité. Au début de cet article, nous avons montré une URL laide https://mysite.com/blog/1. La bonne chose à propos de cette URL moche est qu'elle ne devrait pas changer. En le visitant, vous verrez toujours le blog avec l'identifiant 1. L'inconvénient est qu'il n'est pas descriptif. Combinons donc l'identifiant unique de l'identifiant avec le slug basé sur le titre du blog. En faisant cela, nous obtenons une URL comme celle-ci, https://mysite.com/blog/1/my-awesome-content. L’astuce ici est que la partie slug de l’URL est uniquement destinée à l’esthétique. Cela donne à l’utilisateur une idée de ce que pourrait être le blog portant l’identifiant 1. Implémentons cela dans Laravel pour que l'URL fonctionne mais utilise l'identifiant uniquement pour obtenir le blog et redirige vers le slug mis à jour si le titre change.

Le code

Nous pouvons réaliser le scénario ci-dessus de cette manière. Tout d'abord, dans notre fichier d'itinéraires, nous préciserons l'itinéraire de spectacle suivant.

Route::get('blog/{blog}/{slug?}', [BlogController::class, 'show'])->name('blog.show');
Copier après la connexion

Nous allons maintenant mettre à jour notre modèle Blog pour contenir une méthode d'assistance, qui construit le nouvel itinéraire d'exposition.

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]);
    }
}
Copier après la connexion

Enfin, dans la méthode show de notre BlogController, nous ajouterons ce qui suit.

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'));
}
Copier après la connexion

Dans la méthode show ci-dessus, la liaison du modèle d'itinéraire de Laravel est utilisée pour trouver le bon blog en fonction de l'identifiant fourni. Nous ajoutons ensuite une vérification supplémentaire pour nous assurer que $request->path() correspond à showRoute(). Si ce n'est pas le cas, nous redirigeons vers le bon showRoute() avec un statut de 301 Moved Permanently pour informer le navigateur que le slug a été mis à jour.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!