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

时间:2019-08-22 20:51:04

标签: php laravel laravel-5 laravel-5.8

就像基本的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'));
}

根据从头开始播放,这应该可以。

您知道我该如何解决吗?

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

2 个答案:

答案 0 :(得分:1)

为使Implicit Model Binding起作用,注入的变量名称应与 route参数名称匹配,在您的情况下,我认为您的参数名称可以为{{ 1}},您可以通过在控制台中发出命令{prototype}进行验证。

如果是这样,则必须在控制器函数中将变量名称更改为php artisan route:list(请注意单数形式)以匹配参数名称$prototype,如下所示:

{prototype}

更新:顺带一提,关于Model名称的laravel约定是单数驼峰式,在您的情况下,您的Model应该命名为public function edit(prototypes $prototype) { return view('prototypes.edit', compact('prototype')); } 而不是Prototype,即:

prototypes

答案 1 :(得分:0)

为了将 Prototypes 模型注入控制器变量$prototypes,Laravel希望从路由到方法输入的名称都匹配。因此,在您的路由中,这是

 /prototypes/1/edit

需要成为

 /prototypes/{prototypes}/edit

为了使edit方法能够注入原型模型的正确实例。