【问题标题】:Laravel resource route being assigned incorrect parameter nameLaravel 资源路由被分配了错误的参数名称
【发布时间】: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')-&gt;parameters(['skus' =&gt; 'sku']); 一起工作,但我仍会在 Github 上将其报告为问题。
  • Laravel 使用 Doctrine Inflector 进行复数,你可以针对意外结果提出问题。
  • Laravel 总是建议 singularRoute::resource 使用模型名称,它会自动为你处理复数形式
  • @Ohgodwhy 这是真的吗?更不用说以复数形式为前缀的资源在 API 中似乎更直观、更常见,the documentation 似乎大多数时候也使用复数前缀。

标签: php laravel


【解决方案1】:

你可以像这样使用它:

Route::resource('skus', 'SkusController')->parameters(['skus' => 'sku']);

可用于路由模型绑定。喜欢

public function update(Request $request, Sku $sku)
    {
        $sku->update(); // data to be updated
    }

其中 Sku 将是您的模型名称。

【讨论】:

    猜你喜欢
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 2017-09-11
    相关资源
    最近更新 更多