Laravel returns 编辑路线上的 404 (Laravel 6.11.0)

Laravel returns 404 on a edit route (Laravel 6.11.0)

我创建了以下路线。

Route::resource('admin/products/', 'ProductsController')->middleware('auth');

我使用 Artisan 创建了一个包含所有方法(索引、创建、编辑等)的控制器。

当我使用命令 php artisan route:list 我得到以下路线(以及其他路线):

GET|HEAD | admin/products/{}/edit | edit | App\Http\Controllers\ProductsController@edit | web,auth|
DELETE | admin/products/{} | destroy| App\Http\Controllers\ProductsController@destroy| web,auth|

这是意料之中的事情。但是,当我将 {{ route('edit', $product->id) }} 添加到 link href 时,link 会正确生成,但是当我单击它时,会出现 404 页面。当我使用 form to post 销毁时也是如此(我用 action="{{ route('destroy', $product->id) }}"@method('DELETE') 创建了一个表单,但我仍然得到 404.

任何帮助我开始寻找解决方案的人都将不胜感激。

在你的代码中

GET|HEAD  | admin/products/{}/edit

{} 应该填入一个值,例如 {item}

如果在你的控制器 ProductsController@edit 方法中你有这样的代码

public function edit(Request $request, Item $item){
}

第二个参数 Item $item 应该 1) 存在,2) 应该匹配你在路由 {variable} 中的值,所以如果你有 {item} 方法参数中的变量应该是 item,如果是 {something} 那么它应该是 public function edit(Request $request, Item $something);...

Note that Request $request, is not required in the method;

我想补充一点,这样做 Item $item 如果找不到该项目将导致 404,将根据该项目模型中的 getRouteKeyName() 方法获取该项目,因此,如果您的项目 model 中有类似

的内容
public function getRouteKeyName()
    {
        return 'slug';
    }

该项目将由数据库中的 slug 列提取。同样,如果您没有使用该方法,它将使用 ID。

所以总而言之,web 应该有 {some_value} 匹配你的控制器的那个模型的参数 Product $some_value,其中 some_value 默认是Product 模型,除非您在 Products Eloquent 模型

中定义 getRouteKeyName() 方法

Laravel Controllers Dependency Injection 希望能解决问题![​​=33=]

正如 Harven 所建议的,问题是资源路由没有正确定义。删除反斜杠后,一切开始工作:

Route::resource('admin/products', 'ProductsController')->middleware('auth');

此后路由列表正确填写,路由名称也正确生成

| GET|HEAD| admin/products/{product}/edit | products.edit | App\Http\Controllers\ProductsController@edit | web,auth |