【问题标题】:Laravel - Routes: Controller nested controllerLaravel - 路由:控制器嵌套控制器
【发布时间】:2019-12-12 21:46:24
【问题描述】:

我的路线:

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

【问题讨论】:

  • 在 Laravel 中寻找提供者。
  • 如何注册 classrom 控制器:`Route::apiResource('courses/{course}/classrooms', 'ClassroomController');
  • @mdexp 我的路线不是问题,它发生了,我的问题是需要在我的教室控制器的所有功能中添加$course_id

标签: php laravel laravel-routing laravel-controller


【解决方案1】:

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

【讨论】:

  • 这门课是从哪里来的?你怎么设置的?它是像请求一样来自用户还是基于环境?如果它是作为对所有端点进行分组的请求将解决您的问题,您可以像$request->course 一样访问它。如果它是您的 env 文件中的一个字段,那么我将采用第二种方法。
  • 当我把Route::apiResource('courses.classrooms', 'ClassroomController'); Laravel 自动生成api/v1/courses/{course}/classrooms/{classroom} 时,就是让我的“课堂”需要与课程相关
【解决方案2】:

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

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

【讨论】:

  • 它正在工作,但不解决我的问题...我有关系,这样我仍然会得到课程,但这是所有功能都必须做的...我想要一个自动不需要的方法添加index(Course $course)show(Course $course)update(Course $course)
猜你喜欢
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 2018-09-06
  • 2023-03-27
  • 2023-03-27
相关资源
最近更新 更多