Laravel で ID フォールバックを使用する Slug

PHPz
リリース: 2024-07-31 02:35:12
オリジナル
387 人が閲覧しました

Slugs with an ID fallback in Laravel

元々は私のブログ briandouglas.ie に投稿されました

スラッグは URL を正当なものに見せます。 https://mysite.com/blog/1 のようなリンクをクリックしたい人はいません。それをクリックしたら間違いなくハッキングされます。しかし、それが https://mysite.com/blog/1/some-awesome-content だったらどうでしょうか。これで信頼できるようになりました。そのリンクをクリックすると、間違いなく素晴らしいコンテンツが表示されます。

素朴なやり方

それでは、どのように実装すればよいでしょうか?ブログ リソースのタイトルを使用することもできます。 Laravel は、文字列を取得してそれをsluggizesする Str::slug ヘルパーを提供します。つまり、私の素晴らしいブログ投稿は my-awesome-blog-post になります。これは素晴らしいアイデアのように思えます。ブログ モデルを更新して、保存時にタイトルに基づいてスラッグ値が設定されるようにしましょう。

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);
            }
        });
    }
}
ログイン後にコピー

これで、次のようにリソースの show Route を実装できます。

public function show(string $slug)
{
    return Blog::withSlug($slug)->first();
}
ログイン後にコピー

すごいですね。まさに完全に間違いのない実装です。

でも、タイトルを更新したらどうなるでしょうか??

タイトルが更新されると、スラッグがコンテンツと一致しなくなる可能性があります。

さらに悪いことに、ナメクジも更新される可能性があります!

その後、前の URL は 404 を返し、埋め込みコンテンツが破損する可能性があります。

賢い方法

はい、結局のところ、絶対確実というわけではありません。ブログタイトルは変更になる場合がございます。したがって、URL を変更したくないので、これを基にして URL を設定する必要はありません。

それでは、私たちのブログに関して変えるべきではないものは何でしょうか?それはIDです。この記事の冒頭で、醜い URL https://mysite.com/blog/1 を示しました。この醜い URL の良い点は、変更する必要がないことです。これにアクセスすると、常に ID 1 のブログが表示されることになります。欠点は、説明的ではないことです。そこで、ID の一意の識別子とブログのタイトルに基づいたスラッグを組み合わせてみましょう。これを実行すると、https://mysite.com/blog/1/my-awesome-content のような URL が得られます。ここでのコツは、URL のスラッグ部分は見た目だけを目的としているということです。これにより、ユーザーは ID 1 のブログが何についてのものであるかを知ることができます。これを Laravel で実装して、URL は機能しますが、ID はブログを取得するためだけに使用し、タイトルが変更された場合は更新されたスラッグにリダイレクトするようにしましょう。

コード

上記のシナリオは次のようにして実現できます。まず、ルート ファイルで次の show Route を指定します。

Route::get('blog/{blog}/{slug?}', [BlogController::class, 'show'])->name('blog.show');
ログイン後にコピー

ここで、ブログ モデルを更新して、新しい表示ルートを構築するヘルパー メソッドを含めます。

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]);
    }
}
ログイン後にコピー

最後に、BlogController の show メソッドに以下を追加します。

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'));
}
ログイン後にコピー

上記の show メソッドでは、Laravel のルート モデル バインディングを使用して、指定された ID に基づいて正しいブログを検索します。次に、$request->path() が showRoute() と一致することを確認する追加のチェックを追加します。そうでない場合は、ステータス 301 Moved Permanently の正しい showRoute() にリダイレクトして、スラッグが更新されたことをブラウザに知らせます。

以上がLaravel で ID フォールバックを使用する Slugの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート