【发布时间】: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
如何管理发送到中间件的参数,以免发生错误?
【问题讨论】: