【问题标题】:Resource Controller methods with model as parameter not working以模型为参数的资源控制器方法不起作用
【发布时间】:2019-08-22 20:51:04
【问题描述】:

在基本的 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 方法知道如何使用正确参数的背后是什么机制?

【问题讨论】:

  • 请问您能出示路线声明吗?

标签: php laravel laravel-5 laravel-5.8


【解决方案1】:

要使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'));
}

【讨论】:

  • 太棒了!这部分'注入的变量名称应与路由参数名称匹配'解决了我的问题,兄弟。谢谢。
【解决方案2】:

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

 /prototypes/1/edit

需要

 /prototypes/{prototypes}/edit

为了让编辑方法注入您的原型模型的正确实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-20
    • 1970-01-01
    • 2016-12-31
    • 2020-03-11
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多