Laravel中的显式路由模型绑定?

时间:2019-04-21 12:06:12

标签: php laravel

直到最近,这一直有效,直到我想对其稍作更改。我有一条路线

Route::get('/courses/{course}/lessons/{lesson}', 'CourseLessonController@show')->name('frontend.course.lesson');

我希望{lesson}现在引用order_number,而不是id列。

我已经在RouteServiceProvider中尝试过

Route::bind('lessons', function ($course, $lesson) {
    return App\CourseLesson::where('order_number', $lesson)
    ->where('course_id', $course->id)
    ->first();
});

我还尝试过getRouteKeyName的路线,这可能是可行的,除了它不能确保课程记录是{course}所绑定课程的一部分。

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

它们都不起作用,它似乎仍链接到id列。甚至不能确保课程表中的列course_id与传递给路线的{course}相同...

这是我的控制器方法:

public function show(Course $course, CourseLesson $lesson) {
    return view('frontend.lessons.show', compact('lesson', 'course'));
}

1 个答案:

答案 0 :(得分:2)

欢迎使用StackOverflow:)

只需回答以下问题:

  

我还尝试过getRouteKeyName的路线,这可能是可行的,除了它不能确保课程记录是{course}所绑定课程的一部分。

  

它们都不起作用,它似乎仍链接到id列。甚至不能确保课程表中的列course_id与传递给路线的{course}相同...

听起来您已经可以使用getRouteKeyName(太棒了!),但是您担心的是,它无法验证该课程是否是课程的一部分。

这不是路由的目的-您应该在控制器中处理该逻辑。

例如:

public function show(Course $course, CourseLesson $lesson) {

    // Confirm that this course/lesson combination is valid
    if ($lesson->course_id == $course->id) {
        return view('frontend.lessons.show', compact('lesson', 'course'));
    }

    // The lesson is not in this course
    return redirect(route('home'));
}