以模型为参数的资源控制器方法不起作用

Resource Controller methods with model as parameter not working

与基本 Laracasts.com 教程(Laracast 5.7 从零开始)一样,我正在尝试使用以下方法 public function show(prototypes $prototypes) 参数来构建视图。但是我的视图创建正确但 $prototypes 为空。

该路由运行良好(/prototypes/1/edit),我确保存在一个 ID 为 1 的 prototype 对象。 我发现了一些较旧的解决方案,其中声明使用 (integer $id) 之类的东西作为参数,但这会导致更多代码。它应该像这样工作:

控制器:

public function edit(prototypes $prototypes)
{
    //
    return view('prototypes.edit', compact('prototypes'));
}

根据 Laracast From Scratch 这应该可行。

你知道我该如何解决这个问题吗?

prototypes.edit 方法知道如何使用正确参数的背后机制是什么?

为了将 Prototypes 模型注入控制器变量 $prototypes,Laravel 需要从路由到输入的匹配名称方法。所以在你的路由中,这个:

 /prototypes/1/edit

需要

 /prototypes/{prototypes}/edit

以便编辑方法注入原型模型的正确实例。

为了让 Implicit Model Binding 工作, 注入的变量名称 应该匹配 路由参数名称 ,我认为在你的情况下您的参数名称可能是 {prototype},您可以通过在控制台中发出命令 php artisan route:list 来验证它。

如果是这样,您必须在控制器函数中将变量名称更改为 $prototype(请注意单数)以匹配参数名称 {prototype},如下所示:

public function edit(prototypes $prototype)
{
   return view('prototypes.edit', compact('prototype'));
}

更新:顺便说一下,关于模型名称的 laravel 约定是单数驼峰式大小写,在您的情况下,您的模型应该命名为 Prototype 而不是 prototypes,即:

public function edit(Prototype $prototype)
{
   return view('prototypes.edit', compact('prototype'));
}