假设我有一个模型,表名为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])
,但是我可以更改路由文件中的代码。原因是,该功能遍布整个位置。
答案 0 :(得分:1)
您应该
slug
列slug
填充每一行的Str::slug($item->name)
字段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]);
}