Laravel路线冲突

时间:2017-12-09 20:00:23

标签: php laravel laravel-routing

我有两条路线:

Route::get('subjects/{subject}/{tag?}', 'SubjectController@show');
Route::get('subjects/{subject}/{tag}/{lesson}','LessonController@show');

当我点击第一条路线时,它正常工作但是当我点击第二条路线时,我收到以下错误响应:

  

抱歉,找不到您要查找的页面。

这是因为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'); 
}

当我访问时,比方说,

  

本地主机:3000 /受试者/ mysubject-蛞蝓/ 1

它匹配第一条路线并作出相应的响应,但是当我访问时,

  

本地主机:3000 /受试者/ mysubject-蛞蝓/ 1 / mylesson-蛞蝓

它显示页面未找到错误。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

尝试将控制器更改为

//LessonController.php
public function show($subject, $tag, $lesson)
{
    dd('Inside LessonController@show'); 
}

看看它是否被击中。如果是,则绑定操作不正确。

在旁注中,我想你没有在路线文件中设置Route::resource()某个地方?

答案 1 :(得分:0)

正如评论中所提到的,由于路径模型绑定,当无法检索绑定模型时,最终可能会得到404。使用隐式路由模型绑定时,默认情况下将使用主键进行搜索。可以在模型上更改此值以使用其他字段,在本例中为slug字段。

  

&#34;如果您希望模型绑定在检索给定模型类时使用id以外的数据库列,则可以覆盖Eloquent模型上的getRouteKeyName方法&#34; < / p>      

Laravel 5.5 Docs - Routing - Route Model Binding - Implicit Binding

public function getRouteKeyName()
{
    return 'slug';
}