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

时间:2019-08-05 11:11:55

标签: php laravel laravel-routing laravel-controller

我的路线:

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

如果按照您发布的方式正确注册了路线,则library(dplyr) library(tidyr) df1 %>% mutate(Gene = na_if(Gene, "")) %>% fill(Gene) %>% group_by(Gene) %>% slice(which.max(pvalue)) 中的方法应该会收到一个附加参数,即网址中的课程ID片段。

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

然后,您可以实现ClassroomsController的index方法以使用隐式模型绑定并获取具有课程的给定URL ID的Course实例。

为此,您必须键入“课程”模型的第一个函数的参数,并将变量命名为要用于检索模型的url片段。

在您的代码示例中,您应该这样做:

1

注意:我假设您在“课程”和“课堂”模型之间存在关系,以便从课程模型实例中检索教室

您可以在官方文档here

中了解更多相关信息