gpt4 book ai didi

php - laravel 资源 Controller /路由和模型

转载 作者:行者123 更新时间:2023-12-04 00:05:50 24 4
gpt4 key购买 nike

所以如果你做类似的事情

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

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

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

到你的 routes/web.php。现在,当我使用 artisan routes:list 时,我有像 clowns/{clown} 这样的路线。

但是,我的 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 :“路由参数根据它们的顺序注入(inject)到路由回调/ Controller 中 - 回调/ Controller 参数的名称无关紧要。”但是在这种情况下,参数的名称似乎很重要?

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

最佳答案

  1. 你做错了。文档说:

The parameters array should be an associative array of resource names and parameter names

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

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

Laravel automatically resolves Eloquent models defined in routes or controller actions whose type-hinted variable names match a route segment name.

为了让这个非常酷的东西起作用,参数必须匹配相应模型的标识符(在你的例子中是 TurboClown)。

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

在您的路线文件中:

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

TurboClownController中:

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

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

希望对您有所帮助。

关于php - laravel 资源 Controller /路由和模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45578137/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com