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';
}