猿问

如何将 Laravel 路由功能结构化以创建动态路由?

假设我有一个模型,名为 item 的表,items


+----+-------------+

| id |    name     |

+----+-------------+

|  1 | Burger      |

|  2 | Large Pizza |

+----+-------------+

我希望我的路线功能(至极生成路线)自动生成路线。


示例路由功能


Route::get('item/{item}', itemController@getitem)->name('item');

这就是它返回的内容


route('items',['item' => 1]) => mysite.com/item/1

route('items',['item' => 2]) => mysite.com/item/2

这就是我需要它返回的东西


route('items',['item' => 1]) => mysite.com/item/burger

route('items',['item' => 2]) => mysite.com/item/large-pizza

我想要添加一个像这样的功能性工作


function getItemLink($item){

    $item = Item::find($item);

    return env('APP_URL').'/item/'.strtolower(str_replace(' ','-',$item.name);

}

PS:- 我不想更改调用函数,route('items',['item' => 1])但我可以更改路由文件中的代码。原因是,该功能遍布整个位置。


至尊宝的传说
浏览 216回答 2
2回答

湖上湖

你应该创建将slug在表中添加一列的迁移填写slug每一行的场Str::slug($item->name)告诉 Laravel 你想通过slug字段检索你的模型// YourModel.phppublic function getRouteKeyName(){    return 'slug';}更改链接生成行 route('items',['item' => $item])我知道你讨厌最后一点,但这是必要的。Laravel 已经知道如何使用路由和绑定来构建链接还有最后一点,如果您想切换回带有 id 的链接,您只需getRouteKeyName()要从模型中删除该方法。

皈依舞

这是很常见的,有什么slugs用。由于您不能Large Pizza在 URL 中使用,您需要将其“sluggify”为large-pizza,然后确保 slug 在您的数据库中是唯一的。满足这些条件后,您可以将路线更改为route('items',['item' => "large-pizza"])注意:您定义的Route::get('item/{item}' ...)方式实际上适用于 slug。接下来,更改您的代码以查询与 匹配的项目,slug而不是与id. 例如:public funciton getItem($itemSlug){  $item = Item::where("slug", "=", $itemSlug)->first(); // firstOrFail(), etc.  return view("items.detail")->with(["item" => $item]);}
随时随地看视频慕课网APP
我要回答