如何在没有范围的情况下在 laravel 路由中使用自定义键?

Posted

技术标签:

【中文标题】如何在没有范围的情况下在 laravel 路由中使用自定义键?【英文标题】:How to use custom keys in laravel routes without scoping? 【发布时间】: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 说模型不是这样嵌套的,所以它失败了。 【参考方案1】:

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

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

    不要设置 country:slug,只需使用 country,然后在 Country 和 Post 模型上覆盖 getKeyRouteName() 函数。 或者,特别是如果您想在其他地方使用 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();
    );

【讨论】:

以上是关于如何在没有范围的情况下在 laravel 路由中使用自定义键?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 SSH 的情况下在 GoDaddy 共享主机中托管 Laravel 5.2?

如何在 URL 中没有 # (哈希)的情况下在 Elm 中进行路由/导航?

如何在没有 Laravel 尝试将其保存到数据库的情况下在 Eloquent 模型中使用受保护的属性

Laravel:在没有 Eloquent 的情况下在视图中显示数据

如何在不使用父 App.vue 的情况下在 Laravel 中实例化 vue 3 应用程序?

如何在不默认创建新范围的情况下在 tensorflow 中重用变量范围?