想要在Laravel的URL字段中显示名称而不是id

时间:2018-03-27 08:32:23

标签: laravel laravel-5.3

我不想在Laravel项目的URL字段中显示/route_name/{id}。而不是我希望显示/route_name/{name},而是将后端的id传递给控制器​​。

假设我有一个名为departments的路由,并将名为3的id knee_pain作为参数传递。它就像/departments/3

但我想在我的网址中显示/departments/knee_pain,并希望在我的控制器中传递ID 3而不在id中显示url

怎么做?

2 个答案:

答案 0 :(得分:1)

首先,你必须保证名称是唯一的,如果不是你的控制器中有多个Id。为此,我建议您使用净化器删除空格并使其URL友好: Purifier

第二,可能拥有干净控制器的最佳方法是创建一个中间件,了解什么类型的名称(中间件应该查找哪个表)。您可以通过路由名称验证并将正确的ID发送给控制器。

Middleware docs

答案 1 :(得分:0)

在您的模型中,您可以使用 getRouteKeyName 方法绑定到路线中默认 ID 之外的其他属性:

public function getRouteKeyName()
{
    return 'slug'; // Default is 'id'.
}

我建议使用url友好的属性,而不是使用你可以在应用程序的其他地方使用的name属性来显示条目的名称。你可以使用Str :: slug()来实现它。

public function setNameAttribute($value) {
    $this->name = $value;
    $this->slug = \Str::slug($value);
}

它将会摧毁'你的字符串,例如:\ Str :: slug('膝盖疼痛')=> '膝盖疼痛'

注意:在Laravel 5.5中,使用str_slug()帮助器。

您还应确保此字符串在您的数据库中是唯一的。