为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
至尊宝的传说 2021-06-04 06:02:11
假设我有一个模型,名为 item 的表,items+----+-------------+| id |    name     |+----+-------------+|  1 | Burger      ||  2 | Large Pizza |+----+-------------+我希望我的路线功能(至极生成路线)自动生成路线。示例路由功能Route::get('item/{item}', itemController@getitem)->name('item');这就是它返回的内容route('items',['item' => 1]) => mysite.com/item/1route('items',['item' => 2]) => mysite.com/item/2这就是我需要它返回的东西route('items',['item' => 1]) => mysite.com/item/burgerroute('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 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

你应该

  • 创建将slug在表中添加一列的迁移

  • 填写slug每一行的场Str::slug($item->name)

  • 告诉 Laravel 你想通过slug字段检索你的模型

// YourModel.php

public function getRouteKeyName()

{

    return 'slug';

}

更改链接生成行 route('items',['item' => $item])

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


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


查看完整回答
反对 回复 2021-06-04
?
皈依舞

TA贡献1851条经验 获得超3个赞

这是很常见的,有什么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]);

}


查看完整回答
反对 回复 2021-06-04
  • 2 回答
  • 0 关注
  • 215 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信