最初發佈在我的博客,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中文網其他相關文章!