【问题标题】:Explicit route model binding in Laravel?Laravel 中的显式路由模型绑定?
【发布时间】:2019-04-21 12:06:11
【问题描述】:

所以直到最近这一直有效,直到我想稍微改变它。我有路线

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

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    欢迎来到 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'));
    }
    

    【讨论】:

    • 很抱歉,但这并不能真正解决我的问题,而是一种肮脏的解决方法。它不努力将其与课程相匹配,而且永远不会。因此,它永远不会按我想要的方式工作,因为它总是会在order_number 之前达到id
    • 这将是在 Laravel 应用程序中处理此逻辑的常规方式。我不建议将逻辑放入路由文件,因为它不是其他开发人员希望找到它的地方(例如,如果您将来雇用某人来帮助开发应用程序)。
    猜你喜欢
    • 2018-12-12
    • 2021-05-24
    • 2016-06-04
    • 2018-12-17
    • 2016-04-15
    • 2017-01-12
    • 2015-07-25
    • 1970-01-01
    • 2017-06-22
    相关资源
    最近更新 更多