如何在 Laravel 中将 slugged url 传递给控制器

How to Pass slugged url to Controller in Laravel

大家好,我是 Laravel 的新手,我目前正在尝试将 slugged url 传递到我的控制器中,但我遇到了问题。

我有一个 table 类别,我循环显示所有类别并显示在视图页面 (/posts) 上。我在这个视图中列出了所有类别,这样当用户点击一个类别时,他们将被带到一个不同的页面,显示属于该类别的所有帖子(例如,/posts/category/{categoryID})。我知道我可以通过将类别 ID 传递给控制器​​并找到要传回该视图的 ID 来完成此操作。但是,我正在尝试做一些不同的事情。 我希望将类别名称而不是 id 传递给控制器​​。例如,/posts/category/{类别名称}。但由于某些类别不仅仅是一个词(例如,干洗),这对我来说已成为一个挑战。我早些时候为了 SEO 目的(例如,/posts/category/{Str::str(categoryname)})打了 URL,并从 web.php 文件中创建了一个获取路径。

现在,我想获取与传入的类别名称相关的所有帖子。问题是类别名称是乱码的。

有没有办法从传递给控制器​​的名称中删除别名(“-”或连字符)?因此,它将返回为与数据库中的名称匹配的“干洗”,而不是“干洗”。

我试图避免将 id 传递给 url。

谢谢。

好问题。

您可以使用多种方法来解决此问题。我会 运行 为您完成。

1。将 slug 存储在数据库中

一种选择是将 slug 名称存储在数据库中。就个人而言,这是我最喜欢的选项,因为您不需要进行任何字符串转换。通过这种方法,我会在您的类别 table 中放置一个 slug 列。然后您可以使用类别 eloquent 模型来搜索具有该 slug 的类别。

2。将 slug 转换为标题大小写

第二个选项是将 slug 转换为 title case。您可以使用 Laravel 的字符串 class 来完成此操作。例如:

$categoryName = Str::title($slug);

但是,这种方法存在一些问题。首先,在创建 slug 时,url 将删除不安全的字符,例如撇号。这意味着如果您有复数类别名称,则在将 slug 转换回标题大写时它将不匹配。

其次,通过使用代码转换字符串以匹配数据库中的记录,您将受到服务的支配 class。虽然 Str::title 的功能不太可能改变,但理论上它可能会意味着您稍后必须更改代码。

结论

总的来说,我建议使用第一种方法。您拥有更好的数据完整性,并且进一步减少出错的可能性。因此,如果我是你,我会创建一个新的迁移以将 slug 列添加到你的类别 table 中,然后用它自己的 slug 填充每个类别。然后在查询你的eloquent模型时根据slug列搜索类别。