【发布时间】:2018-10-04 01:45:59
【问题描述】:
使用 Laravel 5.6,我使用以下命令生成资源控制器:
php artisan make:controller SkusController --resource --model=Sku
生成的控制器文件具有正确的类型提示方法。例如:
<?php
namespace App\Http\Controllers;
use App\Sku;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class SkusController extends Controller
{
/**
* Display the specified resource.
*
* @param \App\Sku $sku
* @return \Illuminate\Http\Response
*/
public function show(Sku $sku)
{
//
}
}
现在,我将资源路由添加到我的路由文件中,如下所示:
Route::resource('skus', 'SkusController');
但是,在我的路由列表中,这些路由中的命名参数显示为skus,而不是sku,导致路由模型绑定不起作用。控制器方法中的 $sku 变量结果为空。
例如,这是php artisan route:list 输出中show 方法条目的URI:
skus/{skus}
或者,我对 products 资源遵循相同的过程,并且 URI 是正确的:
products/{product}
在这种情况下,路由模型绑定按预期工作,因为控制器变量称为$product。
我想我可以manually change the parameter name,但我只是想知道为什么有必要这样做。不应该一开始就正确生成路线吗?
【问题讨论】:
-
我得到完全相同的结果。该命令会自动注入
$sku,这不起作用,但将其重命名为$skus可以。看起来像一个错误。 -
谢谢。我能够让它与
Route::resource('skus', 'SkusController')->parameters(['skus' => 'sku']);一起工作,但我仍会在 Github 上将其报告为问题。 -
Laravel 使用 Doctrine Inflector 进行复数,你可以针对意外结果提出问题。
-
Laravel 总是建议
singular为Route::resource使用模型名称,它会自动为你处理复数形式 -
@Ohgodwhy 这是真的吗?更不用说以复数形式为前缀的资源在 API 中似乎更直观、更常见,the documentation 似乎大多数时候也使用复数前缀。