如何构造laravel路由功能以创建动态路由?

时间:2019-05-06 15:09:28

标签: php laravel routes

假设我有一个模型,表名为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]),但是我可以更改路由文件中的代码。原因是,该功能遍布整个位置。

2 个答案:

答案 0 :(得分:1)

您应该

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

我知道您讨厌这最后一点,但这是必要的。 Laravel已经知道如何使用路由和Bindings

建立链接

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

答案 1 :(得分:0)

这很常见,slugs的作用是什么。由于您无法在URL中使用Large Pizza,因此需要将其“分类”为large-pizza,然后确保slug在数据库中是唯一的。

在满足这些条件的情况下,您可以将路线更改为

route('items',['item' => "large-pizza"])

注意:您定义Route::get('item/{item}' ...)的方式实际上将对子弹有效。

接下来,更改代码以查询与slug相匹配的项目,而不是与id相匹配的项目。例如:

public funciton getItem($itemSlug){
  $item = Item::where("slug", "=", $itemSlug)->first(); // firstOrFail(), etc.
  return view("items.detail")->with(["item" => $item]);
}