【问题标题】:How can I structurize laravel route function to created dynamic routes?如何将 laravel 路由函数结构化以创建动态路由?
【发布时间】:2019-05-06 15:09:27
【问题描述】:

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

【问题讨论】:

  • getItem()的内容是什么?
  • 我在任何地方都没有名为 getItem() 的函数,但我在控制器中有 getItem($id),它返回 Json 模型中的项目。

标签: php laravel routes


【解决方案1】:

你应该

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

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

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

【讨论】:

  • 但有时在视图中我没有 $item 而只有 $item_id。
  • 只需将 $item 对象发送到视图就可以设置好了,最好让 Laravel 处理绑定,这样您以后就不必更改路由
【解决方案2】:

这很常见,slugs 是干什么用的。由于您不能在 URL 中使用Large Pizza,因此您需要将其“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]);
}

【讨论】:

  • 我不想更改route('items',['item' => "large-pizza"]) 我想使用route('items',['item' => 2]),因为它已经无处不在了。同样在某个时间点,如果我想将- 更改为+,我必须再次在整个地方更改route('items',['item' => "large+pizza"]),这是我不想要的。
  • 另外,如果想在某个时间点将mysite.com/item/large-pizza 更改为mysite.com/item/Large-Pizza,我必须再次到处更改,这是我不想要的。
  • 我想我当时很困惑。你到底想做什么?基本上,你不能同时拥有mysite.com/item/1mysite.com/item/burger;你的 getItem() 函数不知道如何处理它。
  • 我可以用 slug 的方式来做,但我只能在视图中访问 $item_id,如果我没有 $item 但有 $item_id,我将如何使用route('items', ['item' => $item.slug])
  • 添加一些逻辑以将$item_slug 传递给视图?话虽如此,如果您接受了其他答案,您可能需要考虑提出一个新问题。将数据传递给视图并不复杂,Stackoverflow 上有很多关于如何做到这一点的资源,所以从那里开始,如果需要,可以提出一个新问题。
猜你喜欢
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-12
  • 2014-07-08
相关资源
最近更新 更多