我的路线:
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;
}
注意:我假设您在课程模型和课堂模型之间有关系,可以从课程模型实例
中检索教室您可以在此处的官方文档中阅读有关