我的路线:
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属性,我该怎么办?
发布于 2019-08-05 19:18:40
您可以使用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端点都将以该前缀开头,并且您可以在所有端点中使用该前缀。
发布于 2019-08-05 21:02:17
如果路由像您发布的那样正确注册,那么ClassroomsController中的方法应该会收到一个额外的参数,即来自url的课程id片段。
例如,如果您请求/api/v1/courses/1/classrooms路由,控制器将收到设置为1的正确{course}参数作为第一个参数。
然后,您可以实现ClassroomsController的索引方法,以使用隐式模型绑定,并使用给定的课程url获取课程实例。
为此,你必须输入第一个函数参数的课程模型,并将变量命名为你想要用来检索模型的url片段。
在代码示例中,您应该执行以下操作:
public function index(Course $course)
{
return $course->classrooms;
}注意:我假设您在课程和教室模型之间有一个关系,以便从课程模型实例中检索教室
您可以在官方文档here上阅读更多关于这方面的内容
https://stackoverflow.com/questions/57357407
复制相似问题