ホームページ >バックエンド開発 >PHPチュートリアル >Laravel で ID フォールバックを使用する Slug

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

PHPz
PHPzオリジナル
2024-07-31 02:35:12429ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。