首页  >  文章  >  后端开发  >  Laravel 中具有 ID 回退功能的 Slug

Laravel 中具有 ID 回退功能的 Slug

PHPz
PHPz原创
2024-07-31 02:35:12344浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn