【问题标题】:How to use custom keys in laravel routes without scoping?如何在没有范围的情况下在 laravel 路由中使用自定义键?
【发布时间】:2020-06-24 13:47:59
【问题描述】:

当使用自定义键时,Laravel 会强制我们进行范围界定,例如,我有一条获取国家和帖子的路线

api/countries/{country:slug}/posts/{post:slug}

但我无法使用 slug 键获得它,因为它与国家/地区没有关系,在这种情况下,我想自己处理范围,我不需要隐式范围绑定,但我收到错误(调用未定义的方法 App\Country::posts() )。 因此,我无法使用此 Laravel 功能。有没有办法关闭隐式范围绑定?

【问题讨论】:

  • 请用你目前在代码中尝试过的更多解释一下,这个Call to undefined method App\Country::posts() 的意思是你还没有和国家模型类建立post关系
  • @Vipertecpro 我认为所有信息都在那里。使用自定义键时,嵌套路由参数由更高级别的参数“限定”。所以它试图找到一个作为国家孩子的职位;并且 OP 说模型不是这样嵌套的,所以它失败了。

标签: laravel laravel-7


【解决方案1】:

如果帖子与国家/地区无关,将它们嵌套在 URI 中可能没有意义?

但是,尽管如此,要回答您的问题,您需要做以下两件事之一:

  1. 不要设置 {country:slug},只需使用 {country},然后在 Country 和 Post 模型上覆盖 getKeyRouteName() 函数。
  2. 或者,特别是如果您想在其他地方使用 ID,请使用 explicit model binding.

在路由文件中使用没有自定义键的 slug

class Post
{
    [...]

    public function getRouteKeyName()
    {
        return 'slug';
    }
}

使用显式路由模型绑定

将以下内容添加到 RouteServiceProvider 的 boot() 方法中:

public function boot()
{
    parent::boot();

    Route::bind('post', function ($value) {
        return App\Post::where('slug', $value)->firstOrFail();
    });
}

【讨论】:

    猜你喜欢
    • 2022-10-18
    • 1970-01-01
    • 2021-09-18
    • 2015-12-24
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    相关资源
    最近更新 更多