首页 > 解决方案 > 如何将 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]),但我可以更改路由文件中的代码。原因是,该功能遍布整个位置。

标签: phplaravelroutes

解决方案


你应该

  • 创建将在表中添加一slug列的迁移
  • slug_Str::slug($item->name)
  • 告诉 Laravel 你想通过slug字段检索你的模型
// YourModel.php
public function getRouteKeyName()
{
    return 'slug';
}
  • 更改您的链接生成线route('items',['item' => $item])

我知道你讨厌最后一点,但这是必要的。Laravel 已经知道如何使用路由和绑定来构建链接

最后一点,如果你想切换回带有 id 的链接,你只需getRouteKeyName()要从你的模型中删除该方法。


推荐阅读