0

我的路线:

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 中有一些 Policy/Helper 可以自动完成这项工作吗?

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

4

2 回答 2

0

如果路由像您发布的那样正确注册,您的方法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 模型之间有关系,以便从课程模型实例中检索教室

您可以在此处的官方文档中阅读更多相关信息

于 2019-08-05T13:02:16.850 回答
0

您可以使用 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 端点都将以该前缀开头,并且您可以在所有端点中使用它。

于 2019-08-05T11:18:40.173 回答