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 |
我创建了以下路线。
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 |