【问题标题】:Implicit route model binding parameter problems in middlewares中间件中的隐式路由模型绑定参数问题
【发布时间】:2016-07-13 07:02:57
【问题描述】:

我正在开发一个课程-课程-问题 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 这样的网址时,我想向他显示课程详细信息。为此我写了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/5/Lesson/8 时,仅指课程模型的 ID。因此,在不同的 url 请求上,isThereCourse 中间件会返回如下错误:

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

如何管理发送到中间件的参数,以免发生错误?

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    检查你的中间件。

    基本上,您需要在中间件中进行调试,而 $request 类本身就是一个对象。所以你必须通过这个来检查:

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

    如果$request->course 给你一个Course 类的对象,那么你可以在数组中获取它的输出,以便于理解数据。

    我认为这将有助于您进行调试。

    【讨论】:

      【解决方案2】:

      我的中间件是这样写的:

      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 模型,如果其中一个条件为真,我完成了请求。

      【讨论】:

        猜你喜欢
        • 2019-01-10
        • 2016-06-10
        • 2019-09-05
        • 2018-12-12
        • 1970-01-01
        • 2017-01-12
        • 1970-01-01
        • 2017-07-06
        • 1970-01-01
        相关资源
        最近更新 更多