Laravel点击课程展示课时报错:路由name方法参数不足
解决点击课程展示对应课时的功能问题及路由错误修复
我来帮你一步步搞定这个问题,先从直接触发报错的路由问题入手,再顺带着修正代码里的其他小疏漏,让功能正常跑起来。
1. 先修掉路由的致命错误
你当前的路由写法完全不符合Laravel的规范,这也是报错的直接原因:
Type error: Too few arguments to function Illuminate\Routing\PendingResourceRegistration::name(), 1 passed...
错误点拆解:
Route::resource的第二个参数必须是控制器的完整类名,不能写成LessonsController@show这种格式name()方法对于资源路由来说,需要传入数组参数(或者你应该用names()方法),单独传一个字符串肯定会参数不够
正确的路由写法(二选一)
选项一:用普通GET路由(更贴合你的需求,因为你只需要展示课时的功能)
// 定义路由:传入课程ID,指向控制器的show方法 Route::get('courses/{course}/lessons', 'LessonsController@show')->name('courses.lessons');
选项二:如果一定要用资源路由(其实没必要,因为你只用到show方法)
// resource的第二个参数是控制器类名,用names()自定义路由名称前缀 Route::resource('courses/lessons', 'LessonsController')->names([ 'show' => 'courses.lessons' ]);
2. 修正控制器里的拼写与逻辑问题
你的show方法里有两处明显的错误,还有可以优化的地方:
// 原错误代码 public function show($id) { $cours = Course::findOrFailnd($id); // 拼写错误:findOrFailnd → findOrFail $lessons = course::findOrFail($id)->lesson; // 类名小写+关联方法单数,不符合规范 return view('pages.lessons', compact('lessons', 'cours')); }
修正后的控制器代码
use App\Course; // 确保顶部引入Course模型 public function show($id) { // 预加载课时关联,避免N+1查询问题,提升性能 $course = Course::with('lessons')->findOrFail($id); // 直接从预加载的关联中获取课时 $lessons = $course->lessons; return view('pages.lessons', compact('lessons', 'course')); }
同时建议把Course模型的关联方法改成复数,符合Laravel的命名规范:
// Course模型里的关联方法,从lesson改成lessons(复数) public function lessons() { return $this->hasMany(Lesson::class); }
Lesson模型的关联是正确的,保持不变即可:
public function course() { return $this->belongsTo(Course::class); }
3. 视图代码优化(让展示更友好)
原视图只是简单输出文本,你可以改成列表形式,可读性更强:
<div class="form-group"> <strong>Lessons :</strong> <ul class="mt-2"> @foreach ($lessons as $lesson ) <li>{{ $lesson->long_text }}</li> @endforeach </ul> </div>
4. 前端跳转补充(如何点击课程进入课时页面)
假设你有课程列表页面,每个课程的跳转链接应该这样写:
<!-- 课程列表中的每个课程链接,传入对应课程的ID --> <a href="{{ route('courses.lessons', ['course' => $course->id]) }}">查看{{ $course->name }}的课时</a>
这样点击课程链接后,就能跳转到对应的课时页面,展示该课程下的所有课时了。
内容的提问来源于stack exchange,提问作者louisse
相关产品推荐
相关产品推荐

