以模型为参数的资源控制器方法不起作用
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'));
}
与基本 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'));
}