为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
RISEBY 2021-11-13 17:17:41
我的路线:Route::apiResource('courses', 'CourseController');Route::apiResource('courses.classrooms', 'ClassroomController');列表: php artisan route:listapi/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 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

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


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


查看完整回答
反对 回复 2021-11-13
?
噜噜哒

TA贡献1784条经验 获得超7个赞

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


查看完整回答
反对 回复 2021-11-13
  • 2 回答
  • 0 关注
  • 195 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信