Laravel 中具有 ID 回退功能的 Slug

PHPz
發布: 2024-07-31 02:35:12
原創
386 人瀏覽過

Slugs with an ID fallback in Laravel

最初發佈在我的博客,briandouglas.ie

Slugs 讓 URL 看起來合法。沒有人願意點擊類似 https://mysite.com/blog/1 的連結。如果我點擊它,我肯定會被駭。但如果它讀成 https://mysite.com/blog/1/some-awesome-content 呢?現在看來還是值得信賴的。如果我點擊該鏈接,我肯定會看到一些很棒的內容。

天真的方式

那我們要如何實現呢?好吧,我們可以使用部落格資源的標題。 Laravel 提供了一個 Str::slug 助手,它接受一個字串並sluggizes它。意味著“我的很棒的部落格文章”變成了“我的很棒的部落格文章”。這似乎是個好主意。讓我們更新我們的部落格模型,以便在儲存時它根據標題設定一個 slug 值。

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);
            }
        });
    }
}
登入後複製

現在我們可以像這樣實作資源的顯示路由:

public function show(string $slug)
{
    return Blog::withSlug($slug)->first();
}
登入後複製

太棒了。這是一個完全萬無一失的實施方式。

但是如果我們更新標題怎麼辦? ! ?

如果標題更新,slug 可能不再與內容相符。

或更糟的是,蛞蝓也可能更新!

那麼之前的 url 將返回 404,這可能會破壞嵌入的內容。

聰明的方法

是的,所以畢竟不是萬無一失的。部落格的標題可能會更改。所以這不是我們想要作為 url 基礎的東西,因為我們不希望我們的 url 改變。

那我們的部落格有什麼不該改變的呢?這是身分證。在本文開頭,我們展示了一個醜陋的網址 https://mysite.com/blog/1。這個醜陋網址的好處是它不應該改變。透過造訪它,您將始終查看 ID 為 1 的部落格。缺點是它不具描述性。因此,讓我們將 id 的唯一識別碼與基於部落格標題的 slug 結合起來。透過這樣做,我們得到一個像這樣的網址,https://mysite.com/blog/1/my-awesome-content。這裡的技巧是 url 的 slug 部分只是為了美觀。它讓用戶了解 id 1 的部落格可能是關於什麼的。讓我們在 Laravel 中實現這一點,以便 url 可以工作,但僅使用 id 來獲取博客,並在標題更改時重定向到更新的 slug。

守則

我們可以像這樣實現上面的場景。首先,在我們的路線文件中,我們將指定以下顯示路線。

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() 匹配。如果沒有,我們會重新導向到正確的 showRoute(),狀態為 301 Moved Permanently,讓瀏覽器知道 slug 已更新。

以上是Laravel 中具有 ID 回退功能的 Slug的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板