Laravel 路由冲突
Laravel route conflict
我有两条路线:
Route::get('subjects/{subject}/{tag?}', 'SubjectController@show');
Route::get('subjects/{subject}/{tag}/{lesson}','LessonController@show');
当我点击第一条路线时,它工作正常但是当我点击第二条路线时,我收到以下错误响应:
Sorry, the page you are looking for could not be found.
这是因为 laravel 试图将第二条路线的 /{tag}/{lesson}
部分视为第一条路线的参数值吗?
我的控制器方法如下:
//SubjectController.php
public function show($subjectSlug, $tag = null)
{
dd('Inside SubjectController@show');
}
//LessonController.php
public function show(Subject $subject, Tag $tag, Lesson $lesson)
{
dd('Inside LessonController@show');
}
当我访问时,比如说,
localhost:3000/subjects/mysubject-slug/1
它匹配第一个路由并相应响应,但是当我访问时,
localhost:3000/subjects/mysubject-slug/1/mylesson-slug
显示找不到页面错误。我该如何解决这个问题?
尝试将您的控制器更改为
//LessonController.php
public function show($subject, $tag, $lesson)
{
dd('Inside LessonController@show');
}
看看它是否被击中。如果是,则说明您的绑定不正确。
顺便说一下,我想你没有在路由文件的某处设置 Route::resource()
?
如评论中所述,由于路由模型绑定,当无法检索绑定模型时,您可能会以 404 结束。使用隐式路由模型绑定时,默认情况下将使用主键进行搜索。这可以在模型上更改为使用不同的字段,在本例中为 slug
字段。
"If you would like model binding to use a database column other than id
when retrieving a given model class, you may override the getRouteKeyName
method on the Eloquent model"
Laravel 5.5 Docs - Routing - Route Model Binding - Implicit Binding
public function getRouteKeyName()
{
return 'slug';
}
我有两条路线:
Route::get('subjects/{subject}/{tag?}', 'SubjectController@show');
Route::get('subjects/{subject}/{tag}/{lesson}','LessonController@show');
当我点击第一条路线时,它工作正常但是当我点击第二条路线时,我收到以下错误响应:
Sorry, the page you are looking for could not be found.
这是因为 laravel 试图将第二条路线的 /{tag}/{lesson}
部分视为第一条路线的参数值吗?
我的控制器方法如下:
//SubjectController.php
public function show($subjectSlug, $tag = null)
{
dd('Inside SubjectController@show');
}
//LessonController.php
public function show(Subject $subject, Tag $tag, Lesson $lesson)
{
dd('Inside LessonController@show');
}
当我访问时,比如说,
localhost:3000/subjects/mysubject-slug/1
它匹配第一个路由并相应响应,但是当我访问时,
localhost:3000/subjects/mysubject-slug/1/mylesson-slug
显示找不到页面错误。我该如何解决这个问题?
尝试将您的控制器更改为
//LessonController.php
public function show($subject, $tag, $lesson)
{
dd('Inside LessonController@show');
}
看看它是否被击中。如果是,则说明您的绑定不正确。
顺便说一下,我想你没有在路由文件的某处设置 Route::resource()
?
如评论中所述,由于路由模型绑定,当无法检索绑定模型时,您可能会以 404 结束。使用隐式路由模型绑定时,默认情况下将使用主键进行搜索。这可以在模型上更改为使用不同的字段,在本例中为 slug
字段。
"If you would like model binding to use a database column other than
id
when retrieving a given model class, you may override thegetRouteKeyName
method on the Eloquent model"Laravel 5.5 Docs - Routing - Route Model Binding - Implicit Binding
public function getRouteKeyName()
{
return 'slug';
}