Laravel - 路由:控制器嵌套控制器

我的路线:


Route::apiResource('courses', 'CourseController');

Route::apiResource('courses.classrooms', 'ClassroomController');

列表: php artisan route:list


api/v1/courses/{course}

api/v1/courses/{course}/classrooms/{classroom}

我的问题是:我所有的功能都classroom controller需要course,类似的东西


public function index($course_id)

{

  $classroom = Classroom::where('course_id', $course_id)->get();

  return $classroom;

}


public function store($course_id, Request $request)

{

// ...

  $classroom->course_id = $course_id;

// ...

}


public function show($course_id, $id)

{

  $classroom = Classroom::where('course_id', $course_id)->find($id);

  return $classroom;

}

// ...

在 Laravel 中有一些策略/助手来自动完成这个吗?


我认为没有必要$course_id在所有功能中手动添加属性,我该怎么办?


RISEBY
浏览 197回答 2
2回答

幕布斯7119047

如果路由像您发布的一样正确注册,则您的方法ClassroomsController应该接收一个附加参数,该参数是来自 url 的课程 ID 片段。例如,如果您请求/api/v1/courses/1/classrooms路由,控制器将接收正确的{course}参数设置1为第一个参数。然后,您可以实现 ClassroomsController 的 index 方法以使用隐式模型绑定并使用给定的课程 url id 获取 Course 实例。为此,您必须为第一个函数的参数键入提示 Course 模型,并将变量命名为要用于检索模型的 url 片段。在您的代码示例中,您应该执行以下操作:public function index(Course $course){    return $course->classrooms;}注意:我假设您在 Course 和 Classroom 模型之间存在关系以从课程模型实例中检索教室您可以在此处的官方文档中阅读更多相关信息

噜噜哒

您可以使用 agroup来包含所有路由。就像是: Route::group(['prefix' => '{course}'], function () {// you can place your routes here});因此,该组中存在的所有路由都已经course在 url 路径中具有该值,您不必为每个路由“重写”它。如果该字段是由您设置的,例如一个env变量,那么RouteServiceProvider您可以在mapApiRoutes函数中放置所需的前缀 。 protected function mapApiRoutes()    {        Route::prefix('/api/v1/courses/'.config('app.myVariable'))             ->middleware('api')             ->namespace($this->namespace)             ->group(base_path('routes/api.php'));    }这样,您的所有 api 端点都将以该前缀开头,并且您可以在所有端点中使用它。
打开App,查看更多内容
随时随地看视频慕课网APP