[英]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.