1

我有如下路线。

Route::get('/articles/{articleSlug}' , 
    [App\Http\Controllers\ArticleController::class, 'single']);

single()at ArticleControllerclass的方法在这里:

public function single($slug)
{
    $article = Article::where('slug',$slug)->first();
    $article->increment('viewCount');

    return view('home.article',compact('article'));
}

现在我希望使用 Route Model Bindingarticles根据 column 从表中查找这些数据slug。但据我所知,Route Model Binding 根据 id 查找数据。那么如何将 Route Model Binding 查找数据从更改idslugONLY for ArticleController.php(意味着其他 Controller 类可以使用 id 作为路由模型绑定)?

4

5 回答 5

1

如果您想使用其他模型字段作为出价属性而不是id您可以定义一个getRouteKeyName返回必须使用的字段的名称

class Article extends Model {
    // other methods goes here
    public function getRouteKeyName() {
        return 'slug';
    }
}

或者您可以在定义这样的路由时直接传递字段名称

Route::get('/articles/{article:slug}' , [App\Http\Controllers\ArticleController::class, 'single']);

使用控制器内部的此代码,您必须确保在路由定义中作为参数提供的名称与参数的名称controller匹配

public function single(Article $article)
{
    $article->increment('viewCount');

    return view('home.article',compact('article'));
}
于 2022-02-22T13:04:21.260 回答
0

您的控制器已经设置好,您需要做的就是在路由中将变量名称更改为 $slug,我相信这应该足够了:

Route::get('/articles/{slug}' , [App\Http\Controllers\ArticleController::class, 'single']);
于 2022-02-22T12:49:15.580 回答
0

将您的路线更改为:

Route::get('/articles/{article:slug}' , [App\Http\Controllers\ArticleController::class, 'single']);

然后将 Article 模型注入到您的控制器函数中,让 laravel 为您完成剩下的工作:

public function single(Article $article)
    {
        $article->increment('viewCount');
        return view('home.article',compact('article'));
    }
于 2022-02-22T12:59:00.433 回答
0

您可以直接在路由定义中自定义路由模型绑定:

  1. 过去 app/model/Article.php 中的给定代码:

    公共函数 getRouteKeyName() { return 'slug'; }

2.当您使用 slug 更改路线时

 Route::get('/articles/{article:slug}' , [App\Http\Controllers\ArticleController::class, 'single']);
  1. 使用 id sample change slug 到 id

    Route::get('/articles/{article:id}' , [App\Http\Controllers\ArticleController::class, 'single']);

于 2022-02-22T13:47:10.070 回答
0

您可以像这样将绑定方法添加到您的模型 boot()

public function boot()
{
    Route::bind('article', function ($value) {
        return Article::where('slug', $value)->firstOrFail();
    });
 
}

要了解有关它的更多信息,请阅读 Laravel 文档中的此部分 https://laravel.com/docs/9.x/routing#customizing-the-resolution-logic

于 2022-02-22T14:08:46.780 回答