簡體   English   中英

中間件中的隱式路由模型綁定參數問題

[英]Implicit route model binding parameter problems in middlewares

我正在研究課程,課程,問題,laravel應用程序。

我有一個簡單的課程,像這樣:

class Course extends Model
{
    public $primaryKey = 'course_id';
}

我的路線是這樣的:

Route::group(['prefix' => 'Course'], function () {

            Route::group(['prefix' => '/{course}', 'middleware' => 'isThereCourse'], function () {

                Route::get('/', ['uses' => 'CourseController@course_details'])->where('course', '[0-9]+');

                Route::group(['prefix' => 'Lesson'], function () {
                    Route::group(['prefix' => '/{lesson}', 'middleware' => 'isThereLesson'], function () {
                        Route::get('/', ['uses' => 'LessonController@show_for_user']);
                });

           });
});

我想要當用戶請求類似/Course/5的URL時向他顯示課程詳細信息。為此,我編寫了course_details函數,如下所示:

public function course_details (\App\Course $course)
        {
            $course_categories = $course->course_categories()->get(['name'])->lists('name');
            $org_levels        = $course->org_levels()->get(['name'])->lists('name');

            return view('main/pages/course/course-lessons', compact('course', 'course_categories', 'org_levels'));
        }

如您在course_details看到的,它是與之相關的路由Route::get('/', ['uses' => 'CourseController@course_details'])->where('course', '[0-9]+'); 我使用隱式模型綁定來訪問通過url發送的課程模型。 在這種情況下,一切正常。

現在,用戶可以繼續進行,並可以顯示該課程的詳細信息。例如,用戶可以請求這樣的網址:

/Course/5/Lesson/1

為此,我編寫了另一個名為show函數,如下所示:

public function show_for_user ($id, \App\Lesson $lesson)
{
$lesson = Lesson::with(['homeworks', 'files'])->find($lesson->lesson_id);
}

在這種情況下, $id參數是當前課程所屬課程的ID,因此我想確定課程ID是否存在。

為此,我編寫了一個名為isThereCourse的中間件,內容如下:

public function handle($request, Closure $next)
{
      Course::findOrFail($request->course->course_id);
      return $next($request);
}

問題是在中間件中, $request->course指向不同URL中的不同對象。

當打開/Course/5$request->course引用一個Course模型對象,但是在打開/Course/5/Lesson/8 ,它僅引用Course模型的ID。 因此,在不同的url請求上, isThereCourse中間件返回如下錯誤:

ErrorException in isThereCourse.php line 19:
Trying to get property of non-object

如何管理發送到中間件的參數,這樣就不會發生錯誤?

檢查您的中間件。

基本上,您需要在中間件中進行調試,並且$ request類本身就是一個對象。 因此,您必須檢查以下內容:

dd($request->course->toArray());

如果$request->course為您提供Course類的對象,那么您可以將其輸出放在數組中以方便地理解數據。

我認為這將幫助您進行調試。

我這樣寫中間件:

public function handle ($request, Closure $next)
        {
            $course = $request->course;

            if (
                is_a($course, '\App\Course')
                or
                (is_numeric($course) and !is_null(Course::find($course)))
            ) {
                return $next($request);
            }

            return response()->view('errors/user/403', ['error_msg' => 'Course Not found']);
        }

首先檢查$course參數,該參數是Course模型的實例,否則,如果它是數字,請查找具有該ID的Course模型,並且如果其中一個條件為true,則我完成了請求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM