【问题标题】:laravel resource controllers / routes and modelslaravel 资源控制器/路由和模型
【发布时间】:2018-01-16 14:28:27
【问题描述】:

所以如果你做类似的事情

$ artisan make:model TurboClown
$ artisan make:controller TurboClownController -r --model=TurboClown

所以此时可以添加如下内容:

Route::resource('clowns','TurboClownController');

致您的routes/web.php。现在我有 clowns/{clown} 这样的路线,而我 routes:list 和工匠一起使用。

但是,我的show 函数是这样的:

    public function show(TurboClown $turboClown)

例如,当您 return $turboClown 请求“/clowns/3/”时,它只会给出 [] 作为响应。我花了一段时间才弄清楚,如果我将 $turboClown 参数更改为 $clown,我会得到一个 JSON TurboClown 作为响应。

所以从某种意义上说,我解决了我的问题。但我对以下几点感到好奇:

  1. 对我来说,https://laravel.com/docs/5.4/controllers#restful-naming-resource-route-parameters 读起来好像我可以添加 ['parameters' => ['clown' => 'turboClown'] 然后 show() 可以使用“turboClown”,但事实并非如此。

  2. 根据https://laravel.com/docs/5.4/routing#route-parameters:“路由参数根据它们的顺序注入到路由回调/控制器中 - 回调/控制器参数的名称无关紧要。”但在这种情况下,参数的名称似乎很重要?

所以我正在寻找对这两点的某种澄清,我错过了什么?

【问题讨论】:

    标签: php laravel


    【解决方案1】:
    1. 你做错了。文档说:

    参数数组应该是资源名称和参数名称的关联数组

    因此,在您的情况下,资源名称是“小丑”(而不是“小丑”),并且您希望此资源名称的参数为“turboClown:

    Route::resource('clowns', 'TurboClownController', ['parameters' => [
        'clowns' => 'turboClown'
    ]]);
    
    1. 我同意这一点可能会令人困惑。也许你已经知道了,但你在这里所做的事情叫做implicit route model binding。为了使其“隐含”,有一条规则推翻了您提到的规则:

    Laravel 自动解析定义在路由或控制器操作中的 Eloquent 模型,其类型提示的变量名称与路由段名称匹配。

    此外,为了让这个非常酷的东西起作用,参数必须匹配相应模型的标识符(在您的情况下为 TurboClown)。

    所以现在结合这两点你应该能够做到这一点:

    在您的路线文件中:

    Route::resource('clowns', 'TurboClownController', ['parameters' => [
        'clowns' => 'turboClown'
    ]]);
    

    TurboClownController:

    public function show(TurboClown $turboClown)
    {
        return $turboClown;
    }
    

    现在假设您要检索标识符为 5 的涡轮小丑。您可以调用路由 http://example.dev/clowns/5

    希望对您有所帮助。

    【讨论】:

    • 啊,谢谢路易斯,这就是我想要的。我假设资源名称是复数的“单数化”版本。我猜“在幕后”,'clowns' => 'clown' 正在发生。根据您的建议,routes:list 正确显示“小丑/{turboClown}”
    • 它实际上只是一个数组来明确告诉 Laravel 它应该为哪个资源使用什么参数:)
    • 这对我的项目有所帮助。谢谢。但我还是很困惑:)
    • @Thanpuia 我很高兴它有帮助。您应该看一下Router 类的resource 方法并遵循逻辑。您将了解幕后发生的事情。
    猜你喜欢
    • 1970-01-01
    • 2014-07-08
    • 2013-06-04
    • 2014-10-08
    • 1970-01-01
    • 2013-08-20
    • 2014-02-18
    • 2015-07-20
    • 2018-02-18
    相关资源
    最近更新 更多