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,我该怎么办?

您可以使用 group包围所有路线。类似:

 Route::group(['prefix' => '{course}'], function () {
// you can place your routes here
});

因此,该组中存在的所有路由都将在URL路径中具有course值,并且您不必为每个路线"重写"。

如果您设置了该字段,例如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端点都将从该前缀开始,您可以在所有端点中都有它。

如果像您发布的路线正确注册,则ClassroomsController中的方法应接收一个其他参数,该参数是URL的课程ID片段。

例如,如果请求/api/v1/courses/1/classrooms路由,则控制器将接收到正确的{course}参数设置为1作为第一个参数。

然后,您可以实现classroomscontroller的索引方法来使用隐式模型绑定,并在课程中获取带有给定URL ID的课程实例。

要这样做,您必须键入第一个函数参数的课程模型,并将变量命名为要使用模型的URL片段。

在您的代码示例中,您应该执行:

public function index(Course $course)
{
    return $course->classrooms;
}

注意:我假设您在课程模型和课堂模型之间有关系,可以从课程模型实例

中检索教室

您可以在此处的官方文档中阅读有关

的更多信息

相关内容

  • 没有找到相关文章

最新更新