最初发布在我的博客,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中文网其他相关文章!