为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
拉风的咖菲猫 2023-08-11 17:42:56
大家好,我是 Laravel 的新手,目前我正在尝试将一个 slugged url 传递到我的控制器中,但我遇到了问题。我有一个类别表,所有类别都循环并显示在视图页面(/帖子)上。我在此视图中列出了所有类别,以便当用户单击某个类别时,他们将被带到另一个页面,显示属于该类别的所有帖子(例如,/posts/category/{categoryID})。我知道我可以通过将类别 id 传递到控制器并找到 id 传递回该视图来完成此操作。然而,我正在尝试做一些不同的事情。我希望将类别名称而不是 id 传递给控制器。例如,/posts/category/{类别名称}。但由于有些类别不仅仅是一个词(例如干洗),这对我来说是一个挑战。我之前出于 SEO 目的而使用了 URL(例如 /posts/category/{Str::str(categoryname)}),并从 web.php 文件中创建了一条 get 路由。现在,我想获取与传入的类别名称相关的所有帖子。问题是类别名称被打乱。有没有办法从传递到控制器的名称中删除slug(“-”或连字符)?因此,它将返回为与数据库中的名称匹配的“干洗”,而不是“干洗”。我试图避免将 id 传递给 url。
查看完整描述

1 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

好问题。

您可以使用多种方法来解决此问题。我会为你详细介绍一下。

1. 将slug存储到数据库中

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

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

第二个选项是将 slug 转换为标题大小写。您可以使用 Laravel 的 string 类来做到这一点。例如:

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

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

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

结论

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


查看完整回答
反对 回复 2023-08-11
  • 1 回答
  • 0 关注
  • 54 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信