所以如果你做类似的事情
$ 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 作为响应。
所以从某种意义上说,我解决了我的问题。但我对以下几点感到好奇:
对我来说,https://laravel.com/docs/5.4/controllers#restful-naming-resource-route-parameters读起来好像我可以添加
['parameters' => ['clown' => 'turboClown']
然后show()
可以使用“turboClown”,但它没有。根据https://laravel.com/docs/5.4/routing#route-parameters :“路由参数根据它们的顺序注入(inject)到路由回调/ Controller 中 - 回调/ Controller 参数的名称无关紧要。”但是在这种情况下,参数的名称似乎很重要?
所以我正在寻找对这两点的某种澄清,我错过了什么?
最佳答案
- 你做错了。文档说:
The parameters array should be an associative array of resource names and parameter names
因此,在您的情况下,资源名称是“ clown ”(而不是“ clown ”),并且您希望此资源名称的参数为“turboClown:
Route::resource('clowns', 'TurboClownController', ['parameters' => [
'clowns' => 'turboClown'
]]);
- 我同意这一点可能会令人困惑。也许你已经知道了,但你在这里做的事情叫做 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/