Laravel Route模型绑定(段)仅适用于show方法?

Per*_*ika 3 php routes slug laravel laravel-5.2

我在数据库中有文章模型和文章表。每篇文章可以使用Laravel的标准URI结构来示出:www.example.com/articles/5(其中,5是文章id)。每篇文章都有一个slug字段(articles表中的slug列),因此我使用Route Model Bindingslug代替id

RouteServiceProvider.php:

public function boot(Router $router)
{
    parent::boot($router);

    \Route::bind('articles', function($slug) {
        return \App\Article::where('slug', $slug)->firstOrFail();
    });
}
Run Code Online (Sandbox Code Playgroud)

在routes.php中,我有:

Route::resource('articles', 'ArticleController');
Run Code Online (Sandbox Code Playgroud)

现在可以使用以下网址访问文章:www.example.com/some_slug

但是现在,当我要编辑某些文章时,出现以下错误:

没有有关模型[App \ Article]的查询结果。

例如,当我尝试打开以下代码时:www.example.com/some_slug/edit-我收到该错误。

因此,方法ArticleController @ show(Article $ article)可以正常工作,但是ArticleController @ edit(Article $ article)不起作用。

这是我的路线清单:

烂名单

这是ArticleController的显示和编辑方法:

public function show(Article $article)  // THIS WORKS FINE
{
    $tags = $article->tags()->get();
    return view('articles.show', compact('article', 'tags'));
}

public function edit(Article $article) // DOESN'T WORK -> When I open article/slug/edit I get error: No query results for model [App\Article].
{
    $tags = Tag::lists('name', 'id');
    $categories = Category::orderBy('lft', 'asc')->get()->lists('padded_name', 'id');
    return view('articles.edit', compact('article', 'tags', 'categories'));
}
Run Code Online (Sandbox Code Playgroud)

Sum*_*hwa 11

如果有人想同时使用idand进行路由模型绑定slug,那么显式绑定是这样工作的:

// App\Providers\RouteServiceProvider::boot

Route::bind('product', function($value) {
   return \App\Product::where('id', $value)->orWhere('slug', $value)->first();
});
Run Code Online (Sandbox Code Playgroud)

  • 这很棒。只需添加一点,如果最后将 `first()` 更改为 `firstOrFail()`,它可以避免非对象错误并抛出 404。 (2认同)

Mar*_*ubb 6

我相信在5.2中,您可以使用以下getRouteKeyName方法在模型中直接自定义键名:

public function getRouteKeyName()
{
    return 'slug';
}
Run Code Online (Sandbox Code Playgroud)

docs